1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-25 07:28:20 +00:00
emacs/lisp/iimage.el

150 lines
5.0 KiB
EmacsLisp
Raw Normal View History

;;; iimage.el --- Inline image minor mode. -*- lexical-binding: t -*-
2004-05-11 09:15:55 +00:00
;; Copyright (C) 2004-2021 Free Software Foundation, Inc.
2004-05-11 09:15:55 +00:00
;; Author: KOSEKI Yoshinori <kose@meadowy.org>
;; Maintainer: emacs-devel@gnu.org
2004-05-11 09:15:55 +00:00
;; Keywords: multimedia
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
2004-05-11 09:15:55 +00:00
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
2004-05-11 09:15:55 +00:00
;; 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. If not, see <https://www.gnu.org/licenses/>.
2004-05-11 09:15:55 +00:00
;;; Commentary:
;; Iimage is a minor mode that displays images, when image-filename
;; exists in the buffer.
2004-05-11 09:15:55 +00:00
;;
;; ** Display images in *Info* buffer.
;;
;; (add-hook 'info-mode-hook 'iimage-mode)
2004-05-11 09:15:55 +00:00
;;
;; .texinfo: @file{file://foo.png}
;; .info: `file://foo.png'
;;
;; ** Display images in Wiki buffer.
;;
;; (add-hook 'wiki-mode-hook 'iimage-mode)
2004-05-11 09:15:55 +00:00
;;
;; wiki-file: [[foo.png]]
;;; Code:
(eval-when-compile
(require 'image-file))
(defgroup iimage nil
"Support for inline images."
:version "22.1"
:group 'image)
(defcustom iimage-mode-image-search-path nil
"List of directories to search for image files for iimage-mode."
:type '(choice (const nil) (repeat directory)))
2004-05-11 09:15:55 +00:00
(defvar iimage-mode-image-filename-regex
(concat "[-+./_0-9a-zA-Z]+\\."
(regexp-opt (nconc (mapcar #'upcase
image-file-name-extensions)
image-file-name-extensions)
t)))
(defcustom iimage-mode-image-regex-alist
2004-05-11 09:15:55 +00:00
`((,(concat "\\(`?file://\\|\\[\\[\\|<\\|`\\)?"
"\\(" iimage-mode-image-filename-regex "\\)"
"\\(\\]\\]\\|>\\|'\\)?") . 2))
"Alist of filename REGEXP vs NUM.
2004-05-11 09:15:55 +00:00
Each element looks like (REGEXP . NUM).
NUM specifies which parenthesized expression in the regexp.
Examples of image filename patterns to match:
2004-05-11 09:15:55 +00:00
file://foo.png
\\=`file://foo.png\\='
2004-05-11 09:15:55 +00:00
\\[\\[foo.gif]]
<foo.png>
foo.JPG"
:type '(alist :key-type regexp :value-type integer))
(defvar iimage-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\C-l" #'iimage-recenter)
map)
"Keymap used in `iimage-mode'.")
2004-05-11 09:15:55 +00:00
(defun iimage-recenter (&optional arg)
"Re-draw images and recenter."
(interactive "P")
(iimage-mode-buffer nil)
(iimage-mode-buffer t)
(recenter-top-bottom arg))
;;;###autoload
(define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "24.1")
2004-05-11 09:15:55 +00:00
(defun turn-off-iimage-mode ()
"Unconditionally turn off iimage mode."
2004-05-11 09:15:55 +00:00
(interactive)
(iimage-mode 0))
(defun iimage-modification-hook (beg end)
"Remove display property if a display region is modified."
;;(debug-print "ii1 begin %d, end %d\n" beg end)
(let ((inhibit-modification-hooks t)
(beg (previous-single-property-change end 'display
nil (line-beginning-position)))
(end (next-single-property-change beg 'display
nil (line-end-position))))
(when (and beg end (plist-get (text-properties-at beg) 'display))
;;(debug-print "ii2 begin %d, end %d\n" beg end)
(remove-text-properties beg end
'(display nil modification-hooks nil)))))
2004-05-11 09:15:55 +00:00
(defun iimage-mode-buffer (arg)
"Display images if ARG is non-nil, undisplay them otherwise."
(let ((image-path (cons default-directory iimage-mode-image-search-path))
(edges (window-inside-pixel-edges (get-buffer-window)))
file)
(with-silent-modifications
(save-excursion
(goto-char (point-min))
(dolist (pair iimage-mode-image-regex-alist)
(while (re-search-forward (car pair) nil t)
(when (and (setq file (match-string (cdr pair)))
(setq file (locate-file file image-path)))
;; FIXME: we don't mark our images, so we can't reliably
;; remove them either (we may leave some of ours, and we
;; may remove other packages's display properties).
(if arg
(add-text-properties
(match-beginning 0) (match-end 0)
`(display
,(create-image file nil nil
:max-width (- (nth 2 edges) (nth 0 edges))
:max-height (- (nth 3 edges) (nth 1 edges)))
keymap ,image-map
modification-hooks
(iimage-modification-hook)))
Fix usage of remove-text-properties * lisp/allout-widgets.el (allout-decorate-item-icon): * lisp/emacs-lisp/chart.el (chart-goto-xy): * lisp/forms.el (forms--make-format) (forms--make-format-elt-using-text-properties): * lisp/htmlfontify.el (hfy-unmark-trailing-whitespace): * lisp/net/newst-plainview.el (newsticker-hide-entry) (newsticker-show-entry): * lisp/nxml/nxml-mode.el (nxml-cleanup): * lisp/obsolete/longlines.el (longlines-unshow-hard-newlines) (longlines-encode-region): * lisp/org/ob-exp.el (org-babel-exp-process-buffer): * lisp/org/org-agenda.el (org-agenda-show-new-time): * lisp/progmodes/cc-defs.el (c-clear-char-property-with-value-function) (c-clear-char-property-with-value-on-char-function): * lisp/progmodes/ebrowse.el (ebrowse--hide): * lisp/progmodes/gdb-mi.el (gdb-send): * lisp/progmodes/idlw-shell.el (idlwave-retrieve-expression-from-level): * lisp/progmodes/make-mode.el (makefile-fill-paragraph): * lisp/progmodes/prog-mode.el (prettify-symbols--post-command-hook): * lisp/progmodes/ruby-mode.el (ruby-syntax-propertize): * lisp/tmm.el (tmm-remove-inactive-mouse-face): Always pass an explicit plist to remove-text-properties. * lisp/dired.el (dired--unhide): * lisp/facemenu.el (facemenu-add-face): * lisp/htmlfontify.el (hfy-fontify-buffer): * lisp/iimage.el (iimage-mode-buffer): * lisp/image-file.el (image-file-yank-handler): * lisp/progmodes/prog-mode.el (prettify-symbols--compose-symbol): * lisp/textmodes/tex-mode.el (latex-env-before-change): * test/src/undo-tests.el (undo-test0): Use remove-list-of-text-properties in place of remove-text-properties where appropriate.
2019-08-01 12:59:46 +00:00
(remove-list-of-text-properties
(match-beginning 0) (match-end 0)
'(display modification-hooks))))))))))
2004-05-11 09:15:55 +00:00
;;;###autoload
(define-minor-mode iimage-mode nil
:group 'iimage :lighter " iImg" :keymap iimage-mode-map
2004-05-11 09:15:55 +00:00
(iimage-mode-buffer iimage-mode))
(provide 'iimage)
;;; iimage.el ends here