;;; predictive-setup-html.el --- predictive mode HTML setup function ;; Copyright (C) 2005 2008 Toby Cubitt ;; Author: Toby Cubitt ;; Version: 0.4.1 ;; Keywords: predictive, setup function, html ;; This file is part of the Emacs Predictive Completion package. ;; ;; The Emacs Predicive Completion package 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 of the License, or (at your option) ;; any later version. ;; ;; The Emacs Predicive Completion package 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 the Emacs Predicive Completion package; if not, write ;; to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, ;; Boston, MA 02111-1307 USA ;;; Change Log: ;; ;; Version 0.4 ;; * made `predictive-setup-html' fail gracefully when a required dictionary ;; can't be found ;; ;; Version 0.4 ;; * updated to bring it into line with current auto-overlays ;; * implemented missing `predictive-html-forward-word' function ;; ;; Version 0.3 ;; * major overhaul to bring it up to date with current auto-overlays, ;; compltion-ui and predictive code ;; ;; Version 0.2 ;; * modified to use the new auto-overlays package ;; ;; Version 0.1 ;; * initial release ;;; Code: (require 'predictive) (require 'auto-overlay-nested) (require 'auto-overlay-flat) (provide 'predictive-html) (add-to-list 'predictive-major-mode-alist '(html-mode . predictive-setup-html)) ;; variables used to restore local settings of variables when predictive mode ;; is disabled in a Html buffer (defvar predictive-restore-main-dict nil) (make-variable-buffer-local 'predictive-restore-main-dict) (defvar predictive-restore-override-syntax-alist nil) (make-variable-buffer-local 'predictive-restore-override-syntax-alist) ;; set up 'predictive-latex-word to be a `thing-at-point' symbol (put 'predictive-html-word 'forward-op 'predictive-html-forward-word) ;; html dictionaries (defconst predictive-html-dicts '(dict-html dict-html-char-entity dict-html-common dict-html-core dict-html-events dict-html-international dict-html-a dict-html-area dict-html-base dict-html-quote dict-html-body dict-html-button dict-html-col dict-html-del dict-html-form dict-html-head dict-html-img dict-html-input dict-html-ins dict-html-label dict-html-legend dict-html-link dict-html-map dict-html-meta dict-html-object dict-html-optgroup dict-html-option dict-html-param dict-html-script dict-html-select dict-html-style dict-html-table dict-html-td dict-html-textarea dict-html-tr)) ;; background color for certain auto-overlays to aid debugging (defvar predictive-overlay-debug-color nil) (defun predictive-setup-html (arg) "With a positive ARG, set up predictive mode for use with html major modes. With a negative ARG, undo these changes. Called when predictive mode is enabled via entry in `predictive-major-mode-alist'." (cond ;; ----- enabling html setup ----- ((> arg 0) (catch 'load-fail ;; save predictive-main-dict; restored when predictive mode is disabled (setq predictive-restore-main-dict predictive-main-dict) ;; load the dictionaries (mapc (lambda (dic) (unless (predictive-load-dict dic) (message "Failed to load dictionary %s" dic) (throw 'load-fail nil))) predictive-html-dicts) ;; add html dictionaries to main dictionary list (make-local-variable 'predictive-main-dict) (when (atom predictive-main-dict) (setq predictive-main-dict (list predictive-main-dict))) (setq predictive-main-dict (append predictive-main-dict '(dict-html dict-html-char-entity))) ;; save overlays and unload regexp definitions before killing buffer (add-hook 'kill-buffer-hook (lambda () (auto-overlay-stop 'predictive nil 'save 'leave-overlays) (auto-overlay-unload-set 'predictive)) nil t) ;; use html browser menu if first character of prefix is "<" or "&" (make-local-variable 'completion-menu) (setq completion-menu (lambda (prefix completions) (if (or (string= (substring prefix 0 1) "<") (string= (substring prefix 0 1) "&")) (predictive-html-construct-browser-menu prefix completions) (completion-construct-menu prefix completions)) )) ;; delete any existing predictive auto-overlay regexps and load html ;; auto-overlay regexps (auto-overlay-unload-set 'predictive) (predictive-html-load-regexps) (auto-overlay-start 'predictive) ;; load the keybindings and related settings (predictive-html-load-keybindings) ;; consider \ as start of a word (setq completion-word-thing 'predictive-html-word) t)) ; indicate successful setup ;; ----- disabling html setup ----- ((< arg 0) ;; stop predictive auto overlays (auto-overlay-stop 'predictive nil 'save) (auto-overlay-unload-set 'predictive) ;; restore predictive-main-dict to saved setting (kill-local-variable 'predictive-main-dict) (setq predictive-main-dict predictive-restore-main-dict) (kill-local-variable 'predictive-restore-main-dict) ;; restore completion-dynamic-override-syntax-alist to saved setting (kill-local-variable 'completion-dynamic-override-syntax-alist) (setq auto-completion-override-syntax-alist predictive-restore-override-syntax-alist) (kill-local-variable 'predictive-restore-override-syntax-alist) ;; remove other local variable settings (kill-local-variable 'completion-menu) ;; remove hook function that saves overlays (remove-hook 'kill-buffer-hook (lambda () (auto-overlay-stop 'predictive nil 'save 'leave-overlays) (auto-overlay-unload-set 'predictive)) t) t)) ; indicate successful reversion of changes ) (defun predictive-html-load-regexps () "Load the predictive mode html auto-overlay regexp decinitions." ;; "" delimit comments (auto-overlay-load-definition 'predictive `(flat :id comment ("" :edge end (dict . predictive-main-dict) (priority . 20) (face . (background-color . ,predictive-overlay-debug-color))) )) ;; "<..." starts various tags, ended by ">". "<" makes sure all other ">"s ;; are matched (auto-overlay-load-definition 'predictive `(nested :id tag ("" :edge end (priority . 10)) )) ) (defun predictive-html-load-keybindings () "Load the predictive mode html key bindings." ;; make "<", ">", and "&" do the right thing (setq predictive-restore-override-syntax-alist auto-completion-override-syntax-alist) (make-local-variable 'completion-dynamic-override-syntax-alist) (setq auto-completion-override-syntax-alist (append '((?< . (accept word)) (?> . (accept none)) (?& . (accept word))) auto-completion-override-syntax-alist)) ) (defun predictive-html-construct-browser-menu (prefix completions) "Construct the html browser menu keymap." ;; construct menu, dropping the last two entries which are a separator and a ;; link back to the basic completion menu (would just redisplay this menu, ;; since we're using the browser as the default menu) (let ((menu (completion-construct-browser-menu prefix completions 'completion-browser-menu-item))) (setq menu (butlast menu 2))) ) (defun predictive-html-forward-word (&optional n) ;; going backwards... (if (and n (< n 0)) (unless (bobp) (dotimes (i (- n)) ;; make sure we're at the end of a word (when (re-search-backward "<\\|\\w\\|>" nil t) (forward-char)) (when (= (char-before) ?>) (backward-char)) (when (= (char-syntax (char-before)) ?w) (backward-word 1)) (when (= (char-before) ?<) (backward-char)) )) ;; going forwards... (unless (eobp) (re-search-forward "<\\w*>\\|<\\w*\\|\\w*>\\|\\w+" nil t (or n 1)))) ) ;;; predictive-setup-html.el ends here