* Re: hide-region package and cperl
2006-03-29 5:18 ` Stefan Monnier
@ 2006-03-30 6:24 ` Mathias Dahl
0 siblings, 0 replies; 7+ messages in thread
From: Mathias Dahl @ 2006-03-30 6:24 UTC (permalink / raw)
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> when applying M-x hide-region-hide on a text in cperl-mode, I can see
>> @[]@ tags arround the region, but the text remains visible.
>> emacs-version is 21.3.1
>> The function is ok with 22.0.50.1.
>
>> Does anyone know the cause?
>
> Yes: it uses the t value for its `invisible' property, but doesn't add it to
> the buffer's invisibility spec. As long as the invisibility spec is not
> changed by any other major or minor mode, it works, but in general
> it's incorrect.
>
> Also I'd advise the package author not to use the `intangible' property,
> since it tends to break other packages when they bump into it.
>
>
> Stefan
Thanks for the input, Stefan. I read in the Emacs Lisp Manual about
how to handle this. Hopefully I do the right thing now. I also added a
toggle between using ellipsis or the user-defined markers as markers
for the hidden regions. Now the source also complies with what
`checkdoc' likes. I'd appreciate comments on the part of the code that
handles the invisible property:
;;; hide-region.el --- hide regions of text using overlays
;;
;; Copyright (C) 2001, 2005, 2006 Mathias Dahl
;;
;; Version: 1.0.2
;; Keywords: hide, region
;; Author: Mathias Dahl <mathias.rem0veth1s.dahl@gmail.com>
;; Maintainer: Mathias Dahl
;; URL: http://www.emacswiki.org
;;
;; This file is not part of GNU Emacs.
;;
;; This 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.
;;
;; This 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, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;
;;; Commentary:
;;
;; The function `hide-region-hide' hides the region. You can hide many
;; different regions and they will be "marked" by two configurable
;; strings (so that you know where the hidden text is).
;;
;; The hidden regions is pushed on a kind of hide-region \"ring\".
;;
;; The function `hide-region-unhide' "unhides" one region, starting
;; with the last one you hid.
;;
;;; Bugs
;;
;; Probably many, but none that I know of. Comments and suggestions
;; are welcome!
;;
;;; History:
;;
;; Version 1.0.1
;;
;; * Seems that the getting-stuck problem have disappeared since Emacs
;; 21.3 was released, so no need anymore for the extra movement
;; commands.
;;
;; * Added the intangible property to the overlays because that seemed
;; to remove a minor getting-stuck problem (the overlay "ate" one
;; keystroke) when navigating around an overlay. Adding the intangible
;; property makes it impossible to navigate into the overlay.
;;
;; * Added custom option to propertize the overlay markers for greater
;; visibility.
;;
;; * Minor code cleanup
;;
;; Version 1.0.2
;;
;; * Removed the `intangible' property as suggested by Stefan Monnier.
;;
;; * Tried to do the right thing regarding the `invisible' property
;; and `buffer-invisibility-spec'. Let's see how it works. Also
;; suggested by Stefan.
;;; Code:
(defgroup hide-region nil
"Functions to hide region using an overlay with the invisible
property. The text is not affected."
:prefix "hide-region-"
:group 'convenience)
(defcustom hide-region-before-string "@["
"String to mark the beginning of an invisible region.
This string is not really placed in the text, it is just shown in the overlay"
:type '(string)
:group 'hide-region)
(defcustom hide-region-after-string "]@"
"String to mark the beginning of an invisible region.
This string is not really placed in the text, it is just shown in
the overlay"
:type '(string)
:group 'hide-region)
(defcustom hide-region-use-marker-string t
"Toggles between using ellipsis or user-defined marker.
If non-nil, use the user-defined marker strings
`hide-region-before-string' and `hide-region-after-string'. If
nil, use ellipsis instead."
:type '(boolean)
:group 'hide-region)
(defcustom hide-region-propertize-markers t
"If non-nil, add text properties to the region markers."
:type 'boolean
:group 'hide-region)
(defvar hide-region-overlays nil
"Variable to store the regions we put an overlay on.")
(defun hide-region-hide ()
"Hides a region.
Hides a region by making an invisible overlay over it and save
the overlay on the `hide-region-overlays' \"ring\""
(interactive)
;; Use ellipsis instead of user-defined markers
(if hide-region-use-marker-string
(add-to-invisibility-spec 'hide-region)
(add-to-invisibility-spec '(hide-region . t)))
(let ((new-overlay (make-overlay (mark) (point))))
(setq hide-region-overlays
(append
(list new-overlay) hide-region-overlays))
(overlay-put new-overlay 'invisible 'hide-region)
;; Add user-defined markers
(when hide-region-use-marker-string
(overlay-put new-overlay 'before-string
(if hide-region-propertize-markers
(propertize hide-region-before-string
'font-lock-face 'region)
hide-region-before-string))
(overlay-put new-overlay 'after-string
(if hide-region-propertize-markers
(propertize hide-region-after-string
'font-lock-face 'region)
hide-region-after-string)))))
(defun hide-region-unhide ()
"Unhide a region.
Unhide one region at a time, starting with the last one hidden
and deleting the overlay from the `hide-region-overlays' \"ring\"."
(interactive)
(if (car hide-region-overlays)
(progn
(delete-overlay (car hide-region-overlays))
(setq hide-region-overlays (cdr hide-region-overlays)))))
(provide 'hide-region)
;;; hide-region.el ends here
^ permalink raw reply [flat|nested] 7+ messages in thread