diff options
author | 2003-01-22 18:13:46 +0000 | |
---|---|---|
committer | 2003-01-22 18:13:46 +0000 | |
commit | fb0691dc6f00a0732f29b10676e34231d52ecede (patch) | |
tree | 5a74f1d42a8e5deb42cbefda97e80ebc66b77a18 /x-symbol | |
parent | dd03010bc75bc4d293f3972dac00180284aa8789 (diff) |
X-Symbol version 4.45 beta
Diffstat (limited to 'x-symbol')
-rw-r--r-- | x-symbol/lisp/x-symbol-hooks.el | 1313 | ||||
-rw-r--r-- | x-symbol/lisp/x-symbol-xmacs.el | 183 |
2 files changed, 1496 insertions, 0 deletions
diff --git a/x-symbol/lisp/x-symbol-hooks.el b/x-symbol/lisp/x-symbol-hooks.el new file mode 100644 index 00000000..b22d7260 --- /dev/null +++ b/x-symbol/lisp/x-symbol-hooks.el @@ -0,0 +1,1313 @@ +;;; x-symbol-hooks.el --- pre-loaded stuff for package x-symbol + +;; Copyright (C) 1996-1999, 2001-2003 Free Software Foundation, Inc. +;; +;; Author: Christoph Wedler <wedler@users.sourceforge.net> +;; Maintainer: (Please use `M-x x-symbol-package-bug' to contact the maintainer) +;; Version: 4.4.X +;; Keywords: WYSIWYG, LaTeX, HTML, wp, math, internationalization +;; X-URL: http://x-symbol.sourceforge.net/ + +;; This program 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 program 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 this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; If you want to use package x-symbol, please visit the URL (use +;; \\[x-symbol-package-web]) and read the info (use \\[x-symbol-package-info]). + +;; This file provides `autoload's for package x-symbol, adds functions to hooks +;; for the automatic conversion and defines variables which control the +;; conversion. + +;;; Code: + +(provide 'x-symbol-hooks) +(require 'font-lock) +(eval-when-compile (require 'cl)) +(eval-when-compile + (defvar x-symbol-coding-name-alist) ; in "x-symbol-vars" + (defvar x-symbol-image-colormap-allocation) ; here + (defvar x-symbol-image-convert-colormap) ; here + (defvar x-symbol-cstring-table) ; in x-symbol.el, only needed if loaded + ) +(eval-when-compile + (defvar lazy-shot-minimum-size) + (defvar comint-input-sender) + (defvar comint-last-input-end) + (defvar comint-last-output-start) + (defvar fast-lock-save-faces) + (defvar latex-mode-hook) + (defvar LaTeX-mode-hook) + (defvar LaTeX-math-insert-function) + (defvar orig-buffer) + (defvar reftex-translate-to-ascii-function) +) + +(put 'x-symbol-define-user-options 'lisp-indent-function 2) +(put 'x-symbol-dolist-delaying 'lisp-indent-function 2) +(put 'x-symbol-do-plist 'lisp-indent-function 1) +(put 'x-symbol-while-charsym 'lisp-indent-function 1) +(put 'x-symbol-encode-for-charsym 'lisp-indent-function 1) +(put 'x-symbol-decode-for-charsym 'lisp-indent-function 2) +(put 'x-symbol-ignore-property-changes 'lisp-indent-function 0) + +(defvar x-symbol-warn-of-old-emacs t + "If non-nil, issue warning when using a old/buggy XEmacs. +XEmacs-21.0 to XEmacs-21.1.8 has been reported to core when using input +method token.") + +;; CW: if possible, back to x-symbol.el, do not load too many files at init +(require (if (featurep 'xemacs) 'x-symbol-xmacs 'x-symbol-emacs)) + + + +;;;;########################################################################## +;;;; Variables +;;;;########################################################################## + + +(defvar x-symbol-data-directory + (or (locate-data-directory "x-symbol") + (progn (warn "X-Symbol is not installed at the proper place") + nil)) + "Directory of data files that come with package X-Symbol.") + +(defvar x-symbol-font-directory + (and x-symbol-data-directory + (expand-file-name "pcf/" x-symbol-data-directory)) + "Directory for additional X-Symbol fonts. +If non-nil, used in function `x-symbol-initialize'.") + + +;;;=========================================================================== +;;; Functions to set user options +;;;=========================================================================== + +(defun x-symbol-define-user-options (var options &optional after-set set-fn) + "Define options and setting behavior for user option VAR. +OPTIONS has the form (FALLBACK . ALIST) where ALIST has elements of the +form (OPTION . MENU-TEXT). If ALIST is non-nil, one OPTION should be +equal to FALLBACK, its MENU-TEXT is used for any values not being keys +in ALIST. OPTIONS can also be a function which should return the form +mention above. + +If ALIST is nil, `x-symbol-submenu-filter', which is used by +`x-symbol-menu', uses a toggle button with FALLBACK as the non-nil value +and \\[set-variable] offers completion with matches nil and FALLBACK. +Otherwise, the menu uses radio buttons for all OPTIONs, where MENU-TEXT +is the name of the menu item, and \\[set-variable] offers completion +over all OPTIONs. + +`x-symbol-set-variable', which is invoked by the menu callbacks, uses +SET-FN instead `set' to set the value of VAR if SET-FN is non-nil. +Otherwise, all functions in AFTER-SET are invoked after `set'ting VAR." + (put var 'x-symbol-options options) + (put var 'variable-interactive + (list 'x-symbol-variable-interactive (list 'quote var))) + (while after-set + (pushnew (pop after-set) (get var 'x-symbol-after-set-hook) :test 'equal)) + (if set-fn (put var 'x-symbol-set-function set-fn))) + +;; CW: autoload important if var `x-symbol-auto-mode-suffixes' is saved by +;; custom +;;;###autoload +(defun x-symbol-auto-mode-suffixes (&optional suffixes) + "Return REGEXPs of three-value elements in `auto-mode-alist'. +These REGEXPs are added to SUFFIXES." + (setq suffixes (reverse suffixes)) + (let ((alist auto-mode-alist)) + (while alist + (and (consp (cdar alist)) + (null (member (caar alist) suffixes)) + (push (caar alist) suffixes)) + (setq alist (cdr alist))) + (nreverse suffixes))) + + +;;;=========================================================================== +;;; Initialization +;;;=========================================================================== + +(defcustom x-symbol-initialize t + "Whether to do an extended initialization of package X-Symbol. +If t, do full initialization. Otherwise, the value should be a list +with element. To enable, include + + * `languages' to register all supported token languages, + * `global' to turn on X-Symbol's global mode, i.e., as files are + loaded, execute `turn-on-x-symbol-conditionally', + * `keys' to set up the usual X-Symbol key bindings in `global-map', + * `font-path' to add `x-symbol-font-directory' to the font-path, + * `comint' to make X-Symbol work with comint, + * `fast-lock' to make X-Symbol work with fast-lock, + * `auctex' to make X-Symbol optimally work with AucTeX 9.8a+, it + changes AucTeX's `TeX-region-hook', `TeX-translate-location-hook', + and `LaTeX-math-insert-function', + * `reftex' to make X-Symbol optimally work with RefTeX 3.26+, + * `bib-cite' to make X-Symbol not overwriting bib-cite's highlighting. + +You do not have to install the packages whose initialization is +enabled." + :group 'x-symbol-mode + :type '(choice (const :tag "All" t) + (set :value (languages global keys font-path comint + fast-lock auctex reftex bib-cite) + (const :tag "Token languages" languages) + (const :tag "Global mode" global) + (const :tag "Key bindings" keys) + (const :tag "Font path" font-path) + (const :tag "Package comint" comint) + (const :tag "Package fast-lock" fast-lock) + (const :tag "Package AucTeX" auctex) + (const :tag "Package RefTeX" reftex) + (const :tag "Package bib-cite" bib-cite)))) + +(defvar x-symbol-orig-comint-input-sender 'comint-simple-send + "Original function which sends a string to the comint process.") + + +;;;=========================================================================== +;;; Determine Locale +;;;=========================================================================== + +(defun x-symbol-coding-system-from-locale () + ;; See also EMACS/lisp/international/mule-cmds.el, `set-locale-environment'. + "Get value for `x-symbol-default-coding' from locale. +Use \"locale -ck code_set_name charmap\" and search for the value of +\"code_set_name\" or \"charmap\"." + (save-excursion + (set-buffer (get-buffer-create " *x-symbol-coding-system-from-locale*")) + (erase-buffer) + (call-process shell-file-name nil t nil shell-command-switch + "locale -ck code_set_name charmap") + (goto-char (point-min)) + + (let* ((case-fold-search t) + ;; The GNU recode manual (www-find "recode charset iso646"), lists a + ;; lot of aliases, there are a bit less on + ;; http://mail.nl.linux.org/linux-utf8/2001-10/msg00072.html, I + ;; added some. But this function shouldn't exceed 40 lines... + (map '((iso-8859-1 + "iso-8859-1" "iso8859-1" "iso88591" ; HP: iso88591 + ;; vendor-specific, supersets of ascii + ;; "roman8" ; HP: roman8 is not latin1 + ;; ascii + "ascii" "us-ascii" "ansi_x3.4-1968" "646" "iso646" + "iso_646.irv") + (iso-8859-2 + "iso-8859-2" "iso8859-2" "iso88592") ; HP: iso88592 + (iso-8859-3 + "iso-8859-3" "iso8859-3" "iso88593") ; HP: iso88593 + (iso-8859-9 + "iso-8859-9" "iso8859-9" "iso88599") + (iso-8859-15 + "iso-8859-15" "iso8859-15" "iso885915"))) ; HP: iso885915 + (charmap (and (re-search-forward "^[ \t]*\\(code_set_name\\|charmap\\)[ \t]*=[ \t]*\"\\([^\n\"]+\\)\"" nil t) + (find (downcase (match-string 2)) map + :test 'member)))) + (kill-buffer (current-buffer)) + (car charmap)))) + +(defun x-symbol-buffer-coding (&optional system) + ;; nil = unknown, iso-8859-N otherwise + (let (name) + (if (featurep 'xemacs) + (if (featurep 'mule) + (let* ((sy (or system buffer-file-coding-system)) + (cs (if (symbolp sy) (find-coding-system sy) sy))) + (when (coding-system-p cs) + (setq name (cdr (assq (coding-system-name + (coding-system-base cs)) + '((raw-text . iso-8859-1) + (binary . iso-8859-1) + (escape-quoted . iso-8859-1) + (iso-2022-8 . iso-8859-1) + (iso-2022-8bit-ss2 . iso-8859-1) + (iso-2022-lock . iso-8859-1) + (iso-8859-2 . iso-8859-2) + (iso-8859-3 . iso-8859-3) + (iso-8859-9 . iso-8859-9) + (iso-8859-15 . iso-8859-15) + (ctext . iso-8859-1))))))) + (setq name x-symbol-default-coding)) + (let ((cs (or system buffer-file-coding-system 'no-conversion))) + (when (coding-system-p cs) + (setq name (cdr (assq (coding-system-base cs) + '((raw-text . iso-8859-1) ; console + (iso-latin-1 . iso-8859-1) + (iso-latin-1-with-esc . iso-8859-1) + (iso-latin-2 . iso-8859-2) + (iso-latin-2-with-esc . iso-8859-2) + (iso-latin-3 . iso-8859-3) + (iso-latin-3-with-esc . iso-8859-3) + (iso-latin-9 . iso-8859-9) + (iso-latin-9-with-esc . iso-8859-9) + (iso-latin-15 . iso-8859-15) + (iso-latin-15-with-esc . iso-8859-15) + (compound-text . iso-8859-1)))))))) + (if (or (null (boundp 'x-symbol-fchar-tables)) + (assq name x-symbol-fchar-tables)) + name))) + +(unless window-system + (warn "X-Symbol: only limited support on a character terminal") + (unless (and (boundp 'x-symbol-latin-force-use) + (eq x-symbol-latin-force-use 'console-user)) + (setq x-symbol-latin1-fonts nil) + (setq x-symbol-latin2-fonts nil) + (setq x-symbol-latin3-fonts nil) + (setq x-symbol-latin5-fonts nil) + (setq x-symbol-latin9-fonts nil) + (setq x-symbol-xsymb0-fonts nil) + (setq x-symbol-xsymb1-fonts nil))) + +(defvar x-symbol-default-coding + ;; TODO: make much nicer (do not use `x-symbol-buffer-coding' directly) + (cond (noninteractive 'iso-8859-1) + ((featurep 'mule) + (let* ((cs (default-value 'buffer-file-coding-system)) + (val (cond (cs + (x-symbol-buffer-coding cs)) + ((equal current-language-environment "English") + 'iso-8859-1))) + (loc (x-symbol-coding-system-from-locale))) + (and loc + (not (eq loc val)) + (warn "X-Symbol: Emacs language environment and system locale specify different encoding, I'll assume `%s'" val)) + val)) + ((x-symbol-coding-system-from-locale)) + (t + (warn "X-Symbol: cannot deduce default encoding, I'll assume `iso-8859-1'") + 'iso-8859-1)) + "Coding used for 8bit characters in buffers. +Also used for a 8bit file codings where `x-symbol-coding' has value nil. +Supported values are `iso-8859-1', `iso-8859-2', `iso-8859-3' and +`iso-8859-9', it should correspond to the normal charset registry of +your `default' face. + +WARNING: Under XEmacs/Mule, package x-symbol is only tested with value +`iso-8859-1'! It is assumed that you have not changed any of the +various Mule codings-system variables, i.e., it assumes iso-8859-1. Use +\\[x-symbol-package-bug] to give the author some advice on Mule.") + +(unless (or (memq x-symbol-default-coding + '(nil iso-8859-1 iso-8859-2 iso-8859-3 iso-8859-9)) + (and (eq x-symbol-default-coding 'iso-8859-15) + (or (not (featurep 'xemacs)) + (not (featurep 'mule)) + (fboundp 'emacs-version>=) (emacs-version>= 21 5)))) + (warn "X-Symbol: illegal `x-symbol-default-coding', I'll use nil") + (setq x-symbol-default-coding nil)) + + +;;;=========================================================================== +;;; General Configuration +;;;=========================================================================== + +(defcustom x-symbol-compose-key '(control ?\=) + "Key used to access command `x-symbol-map'. +By default, pressing this key twice invokes the GRID: \\[x-symbol-grid]. +This is a list, no vector!" + :group 'x-symbol-input-init + :type '(x-symbol-key :tag "Prefix key")) + +(defcustom x-symbol-auto-key-autoload t + "*If non-nil, pressing `x-symbol-compose-key' initialize x-symbol. +The binding of `x-symbol-compose-key' is redefined after initialization. +With value nil, you must provide a prefix argument to initialize package +X-Symbol." + :group 'x-symbol-input-init + :type 'boolean) + +(defvar x-symbol-auto-conversion-method 'auto-slow + ;;(if (featurep 'crypt) 'slow 'fast) + "Non-nil means, set up hooks for auto conversion. +Fast methods are used if this variable has value `fast'. Otherwise, +slower methods are used and \\[vc-register] or \\[vc-next-action] will +fail to decode the buffer contents. + +You should set this variable to value `slowest' if, for example, the +symbol for \\alpha looks like \\233a after \\[save-buffer] (this happens +on some systems). Value `fast' should not be used, if some other +package, e.g., crypt, adds a function to `write-file-hooks' which does +not inspect the remaining functions in this hook. + +Default value `auto-slow' is set to `fast' after the initialization of +XEmacs if package crypt has not been loaded by then.") + + +;;;=========================================================================== +;;; Known Token Languages +;;;=========================================================================== + +(defvar x-symbol-language-alist nil + "Alist of currently registered token languages. +Elements look like (LANGUAGE . NAME) where LANGUAGE is the symbol +representing and NAME is the name normally presented to the user, +see `x-symbol-language-text'. + +You should not set this variable directly, use +`x-symbol-register-language' instead!") + +(defcustom x-symbol-charsym-name "x-symbol charsym" + "Name of the pseudo token language x-symbol charsym. +This pseudo language corresponds to `x-symbol-language' having value nil +and is used for input methods, not for decoding and encoding. See +`x-symbol-language-text'." + :group 'x-symbol-miscellaneous + :type 'string) + +(defcustom x-symbol-tex-name "TeX macro" + "Name of token language `tex'. See `x-symbol-register-language'." + :group 'x-symbol-tex + :type 'string) + +(defcustom x-symbol-tex-modes + '(tex-mode latex-mode plain-tex-mode noweb-mode) + "Major modes using language `tex'. See `x-symbol-register-language'." + :group 'x-symbol-tex + :group 'x-symbol-mode + :type '(repeat function)) + +(defcustom x-symbol-sgml-name "SGML entity" + "Name of token language `sgml'. See `x-symbol-register-language'." + :group 'x-symbol-sgml + :type 'string) + +(defcustom x-symbol-sgml-modes + ;;'(sgml-mode xml-mode html-mode hm--html-mode html-helper-mode) + '(html-mode hm--html-mode html-helper-mode) + "Major modes using language `sgml'. See `x-symbol-register-language'." + :group 'x-symbol-sgml + :group 'x-symbol-mode + :type '(repeat function)) + +(defcustom x-symbol-bib-name "BibTeX macro" + "Name of token language `bib'. See `x-symbol-register-language'." + :group 'x-symbol-bib + :type 'string) + +(defcustom x-symbol-bib-modes '(bibtex-mode) + "Major modes using language `bib'. See `x-symbol-register-language'." + :group 'x-symbol-bib + :group 'x-symbol-mode + :type '(repeat function)) + +(defcustom x-symbol-texi-name "TeXinfo command" + "Name of token language `tex'. See `x-symbol-register-language'." + :group 'x-symbol-texi + :type 'string) + +(defcustom x-symbol-texi-modes '(texinfo-mode) + "Major modes using language `texi'. See `x-symbol-register-language'." + :group 'x-symbol-texi + :group 'x-symbol-mode + :type '(repeat function)) + + +;;;=========================================================================== +;;; Buffer-locals +;;;=========================================================================== + +(defvar x-symbol-mode nil + "Non-nil if X-Symbol minor mode is enabled.") + +(make-variable-buffer-local 'x-symbol-mode) +(x-symbol-define-user-options 'x-symbol-mode '(t) + nil (lambda (dummy arg) (x-symbol-mode (if arg 1 0)))) + +(defvar x-symbol-language nil + "*Token language used in current buffer. +A valid value is required to turn on `x-symbol-mode' which also sets +this variable to a reasonable value if the variable is not yet +buffer-local. The value influences the conversion, i.e., decoding and +encoding of X-Symbol characters, input methods TOKEN and READ-TOKEN, +fontification of super- and subscripts, image command recognition, the +info in the echo area, etc.") + +(make-variable-buffer-local 'x-symbol-language) +(put 'x-symbol-language 'permanent-local t) +(x-symbol-define-user-options 'x-symbol-language + (lambda () (list* nil '(nil . "None") x-symbol-language-alist)) + '(x-symbol-update-modeline)) + +(defvar x-symbol-coding nil + "*Coding of 8bit characters in a file. +Supported values are `iso-8859-1', `iso-8859-2', `iso-8859-3' and +`iso-8859-9', value nil means the value of `x-symbol-default-coding'. +Determines which characters are considered to be 8bit characters for +file operations. Function `x-symbol-mode' sets this variable to a +reasonable value if the variable is not yet buffer-local. + +During decoding, e.g., when visiting a file, the value is always +important for the interpretation of 8bit characters, an invalid value is +considered to be equivalent to value nil. During encoding, e.g., when +saving a buffer, 8bit characters are not encoded to tokens if the value +is valid and `x-symbol-8bits' is non-nil.") + +(make-variable-buffer-local 'x-symbol-coding) +(put 'x-symbol-coding 'permanent-local t) +(x-symbol-define-user-options 'x-symbol-coding + (lambda () (cons x-symbol-default-coding x-symbol-coding-name-alist)) + '(x-symbol-update-modeline)) + +(defvar x-symbol-8bits nil + "*If non-nil, do not encode 8bit characters. +Variable `x-symbol-coding' determines which characters are assumed to be +8bit characters. Note that tokens representing 8bit characters are +always decoded. Function `x-symbol-mode' sets this variable to a +reasonable value if the variable is not yet buffer-local.") +;; TODO: link to `x-symbol-unique' + +(make-variable-buffer-local 'x-symbol-8bits) +(put 'x-symbol-8bits 'permanent-local t) +(x-symbol-define-user-options 'x-symbol-8bits '(t) + '(x-symbol-update-modeline)) + +(defvar x-symbol-unique nil + "*If non-nil, only decode canonical tokens.") +;; TODO: link to `x-symbol-8bits' + +(make-variable-buffer-local 'x-symbol-unique) +(put 'x-symbol-unique 'permanent-local t) +(x-symbol-define-user-options 'x-symbol-unique '(t) + '(x-symbol-update-modeline)) + +(defvar x-symbol-subscripts nil + "*If non-nil, use special fonts to display super- and subscripts. +This feature must be supported by the token language dependent font-lock +keywords. Function `x-symbol-mode' sets this variable to a reasonable +value if the variable is not yet buffer-local. Some parts of the text +might be invisible, see also variable `x-symbol-reveal-invisible'.") + +(make-variable-buffer-local 'x-symbol-subscripts) +(x-symbol-define-user-options 'x-symbol-subscripts '(t) + '(x-symbol-update-modeline x-symbol-fontify)) + +(defvar x-symbol-image nil + "*If non-nil, show little glyphs after image insertion commands. +This feature must be supported by the token language dependent image +keywords, see `x-symbol-image-parse-buffer'. Function `x-symbol-mode' +sets this variable to a reasonable value if the variable is not yet +buffer-local.") + +(make-variable-buffer-local 'x-symbol-image) +(x-symbol-define-user-options 'x-symbol-image '(t) + '(x-symbol-update-modeline) 'x-symbol-set-image) + + +;;;=========================================================================== +;;; Minor mode control +;;;=========================================================================== + +(defcustom x-symbol-auto-mode-suffixes (x-symbol-auto-mode-suffixes) + "*Regexps matching file suffixes not to be considered. +All suffixes from a file name matching these regexps are deleted before +the file name is used for `x-symbol-auto-mode-alist'. The default value +includes the REGEXP in all three-valued elements of `auto-mode-alist', +at definition time, of course." + :group 'x-symbol-mode + :type '(repeat regexp)) + +(defcustom x-symbol-auto-8bit-search-limit nil + "*Limits search for 8bit characters in the file. +Used when finding an appropriate value for `x-symbol-8bits'. See also +`x-symbol-mode'." + :group 'x-symbol-mode + :type '(choice (const :tag "No limit" nil) (integer :tag "Limit"))) + +(defcustom x-symbol-auto-style-alist nil + ;; TODO: docstring outdated + "*Alist to setup X-Symbol values for buffers visiting files. +Elements look like + (MATCH LANGUAGE MODE-ON CODING 8BITS UNIQUE SUBSCRIPTS IMAGE) +If MATCH matches a buffer in which command `x-symbol-mode' is invoked, +the rest of the element is used to setup some buffer-local x-symbol +specific variables. If no element matches, set `x-symbol-language' to +the symbol property `x-symbol-language' of the major mode symbol if the +variable is not already buffer-local. + +If `x-symbol-mode' is not already buffer-local, MODE-ON determines +whether to turn the mode on if `x-symbol-mode' is called with a cons as +prefix argument. LANGUAGE, CODING, 8BITS, UNIQUE, SUBSCRIPTS and IMAGE +are used to set `x-symbol-language', `x-symbol-coding', +`x-symbol-8bits', `x-symbol-unique', `x-symbol-subscripts' and +`x-symbol-image' if these values are not already buffer-local. + +MATCH is either a list of major modes which must include the mode of the +current buffer or a regexp matching the file name ignoring some +suffixes, see `x-symbol-auto-mode-suffixes', or a value used directly. +MODE-ON, LANGUAGE, CODING, 8BITS, UNIQUE, SUBSCRIPTS and IMAGE are +`eval'ed in that order. During the evaluation, `x-symbol-mode' is +non-nil according to MODE-ON. + +See the documentation of `x-symbol-auto-style' for the auto-style +language accesses." + :group 'x-symbol-mode + :type '(repeat (cons :format "%v" + (choice (repeat :tag "In major modes" + :menu-tag "In major modes" + (function :value text-mode)) + (regexp :tag "When matched by") + (function :tag "Predicate")) + (cons :format "%v" + (symbol :tag "Token language") + ;;(x-symbol-auto-style :inline t)))) + (choice (x-symbol-auto-style + :menu-tag "Values" + :format "\n%v") + (variable :tag "Like variable")))))) + +(defvar x-symbol-mode-disable-alist nil) +;; just a `defvar' people should know what they are doing... + + +;;;=========================================================================== +;;; Images +;;;=========================================================================== + +(defun x-symbol-image-set-colormap (var value) + "Set VAR's value to VALUE. +Custom set function of `x-symbol-image-colormap-allocation' and +`x-symbol-image-convert-colormap'." + (if var (set var value)) + (if (boundp 'x-symbol-image-convert-colormap) + (put 'x-symbol-image-convert-colormap 'x-symbol-image-instance + (and (boundp 'x-symbol-image-colormap-allocation) + x-symbol-image-colormap-allocation + x-symbol-image-convert-colormap + (if (featurep 'xemacs) + (make-image-instance + (vector x-symbol-image-colormap-allocation + :file x-symbol-image-convert-colormap) + nil nil t) + (create-image x-symbol-image-convert-colormap + x-symbol-image-colormap-allocation)))))) + +(defcustom x-symbol-image-colormap-allocation 'xpm + "If non-nil, prevent colors in colormap to be de-allocated. +The non-nil value should be an image format. See +`x-symbol-image-convert-colormap'." + :group 'x-symbol-image-general + :initialize 'custom-initialize-default + :set 'x-symbol-image-set-colormap + :type '(choice (const :tag "Colors can be de-allocated" nil) + (const :tag "Colormap is xpm file" xpm) + (symbol :tag "Other image format"))) + +(defcustom x-symbol-image-convert-colormap + (and x-symbol-data-directory + (expand-file-name "colormap138.xpm" x-symbol-data-directory)) + "File name of colormap files. +Used by `x-symbol-image-start-convert-colormap' for image cache file +names not matched by `x-symbol-image-convert-mono-regexp'. See also +`x-symbol-image-colormap-allocation'." + :group 'x-symbol-image-general + :initialize 'custom-initialize-default + :set 'x-symbol-image-set-colormap + :type '(choice (const :tag "No map" nil) file)) + + + +;;;;########################################################################## +;;;; Code +;;;;########################################################################## + + +(defalias 'x-symbol-cset-registry 'caaar) +(defalias 'x-symbol-cset-coding 'cdaar) +(defalias 'x-symbol-cset-leading 'cadar) +(defalias 'x-symbol-cset-score 'caddar) +(defalias 'x-symbol-cset-left 'cadr) +(defalias 'x-symbol-cset-right 'cddr) + +(defvar x-symbol-input-initialized nil + "Internal. If non-nil, the input methods are initialized.") + + +;;;=========================================================================== +;;; Key autoload +;;;=========================================================================== + +;;;###autoload +(defun x-symbol-key-autoload (&optional arg) + "Initialize package x-symbol and use the keys for this command again. +Package x-symbol and the functions in `x-symbol-load-hook' should +re-bind all key-sequence which invoke this command. You should provide +a prefix argument ARG to this command if `x-symbol-auto-key-autoload' is +nil." + (interactive "P") + (when x-symbol-input-initialized + (error "%s should be rebound in `x-symbol-init-input-hook'" + (key-description (this-command-keys)))) + (unless (or arg x-symbol-auto-key-autoload) + (error "Use %s with prefix argument to initialize the input methods" + (key-description (this-command-keys)))) + (let ((this (append (this-command-keys) nil))) + ;; for some reason this loop is necessary... + (while (and this (null (eq (key-binding (vector (car this))) this-command))) + (setq this (cdr this))) + (setq prefix-arg arg) + (setq unread-command-events this)) + (x-symbol-init-input)) + +;;;###autoload +(defalias 'x-symbol-map-autoload 'x-symbol-key-autoload) + + +;;;=========================================================================== +;;; Minor mode, fontification +;;;=========================================================================== + +(defun x-symbol-buffer-file-name () + (when buffer-file-name + (let ((name (file-name-sans-versions buffer-file-name)) + (case-fold-search (eq system-type 'vax-vms)) + (suffixes x-symbol-auto-mode-suffixes)) + (while suffixes + (and (string-match (pop suffixes) name) + (< (match-beginning 0) (length name)) + ; protect against stupid regexp + (setq name (substring name 0 (match-beginning 0)) + suffixes x-symbol-auto-mode-suffixes))) + name))) + +(defun x-symbol-auto-set-variable (symbol form) + "Set SYMBOL's value to evaluated FORM if SYMBOL is not buffer-local." + (or (local-variable-p symbol (current-buffer)) + (set symbol (eval form)))) + +;;;###autoload +(defun x-symbol-mode (&optional arg special) + "Toggle X-Symbol mode. +If ARG is a cons, e.g., when \\[x-symbol-mode] is preceded by one or +more \\[universal-argument]'s with no digits, turn on X-Symbol mode +conditionally, see MODE-ON in `x-symbol-auto-mode-alist'. Otherwise, +turn X-Symbol mode on if ARG is positive, else turn it off. If some +X-Symbol specific local variables are not buffer-local, set them to +reasonable values according to `x-symbol-buffer-mode-alist' and +`x-symbol-auto-mode-alist'. + +Turning X-Symbol mode on requires a valid `x-symbol-language' and also +decodes tokens if the mode was turned off before, see +\\[x-symbol-decode]. Turning X-Symbol mode off also encodes x-symbol +characters if the mode was turned on before, see \\[x-symbol-encode]. +If argument INIT is non-nil, the old mode status is assumed to be off." + (interactive (list current-prefix-arg 'interactive)) + (if (eq special 'init) (setq x-symbol-mode nil)) + (let* ((old-mode (if (eq special 'init) nil x-symbol-mode)) + (new-mode (if arg + (> (prefix-numeric-value arg) 0) + (not x-symbol-mode))) + (disabled0 (assq major-mode x-symbol-mode-disable-alist)) + (disabled1 (if disabled0 + (cdr disabled0) + (get major-mode 'x-symbol-mode-disable))) + (disabled (cond (old-mode nil) + ((null new-mode) nil) + ((null disabled1) + (and buffer-file-name (get major-mode 'mode-class) t)) + ((eq disabled1 'error)) + ((stringp disabled1) disabled1) + ((functionp disabled1) (funcall disabled1))))) + (setq x-symbol-mode nil) + (when disabled + (if (and (eq special 'interactive) + arg + (yes-or-no-p + (format "Cannot use X-Symbol with %s Mode. Turn on anyway? " + mode-name))) + (setq disabled nil) + (or (stringp disabled) + (setq disabled (format "%s Mode does not allow to turn on X-Symbol" + mode-name))) + (setq new-mode nil))) + (when new-mode + (let* ((buffer-file-name (x-symbol-buffer-file-name)) + (buffer-name (or buffer-file-name (buffer-name))) + (alist x-symbol-auto-style-alist) + (style (get major-mode 'x-symbol-style)) + ;; WARNING: `values' is a global variable which is set during GC + ;; (and we have dynamic scoping)! major-modes can set a specific + ;; language + matcher) + (while alist + (setq matcher (caar alist)) + (if (cond ((stringp matcher) (string-match matcher buffer-name)) + ((consp matcher) (memq major-mode matcher)) + ((functionp matcher) (funcall matcher))) + (setq style (cdar alist) + alist nil) + (setq alist (cdr alist)))) + (unless style + (let ((langs x-symbol-language-alist)) + (while langs + (if (memq major-mode + (symbol-value (get (caar langs) 'x-symbol-modes))) + (setq style (cons (caar langs) t) + langs nil) + (setq langs (cdr langs)))))) + (if (car style) + (or (local-variable-p 'x-symbol-language (current-buffer)) + (setq x-symbol-language (car style)))) + ;; check language ---------------------------------------------------- + (if (and x-symbol-language + (symbolp x-symbol-language) + (get x-symbol-language 'x-symbol-feature)) + (when (and (eq special 'interactive) (consp arg)) + (setq x-symbol-language + (x-symbol-read-language + (format "Token Language for X-Symbol mode (default %s): " + (x-symbol-language-text)) + x-symbol-language 'cdr))) + (if (eq special 'interactive) + (or (setq x-symbol-language + (x-symbol-read-language + "Token Language for X-Symbol mode: " nil 'cdr)) + (setq disabled + "A valid token language is required to turn on X-Symbol")) + ;; no simple `setq': prevent making `x-symbol-language' buffer-local + (if x-symbol-language (setq x-symbol-language nil))) + (setq style nil)) + (when x-symbol-language + (require (get x-symbol-language 'x-symbol-feature)) + (setq style + (cond ((or (null style) (eq (cdr style) t) + (not (eq (car style) x-symbol-language))) + (symbol-value (get x-symbol-language + 'x-symbol-auto-style))) + ((and (symbolp (cdr style)) (boundp (cdr style))) + (symbol-value (cdr style))) + (t + (cdr style)))) + (setq x-symbol-mode (eval (car style))) + (x-symbol-auto-set-variable 'x-symbol-coding (cadr style)) + (or (local-variable-p 'x-symbol-8bits (current-buffer)) + (setq x-symbol-8bits (or (eval (caddr style)) + (x-symbol-auto-8bit-search)) + ;; use value `null' to disable 8bit char search + x-symbol-8bits (and (not (eq x-symbol-8bits 'null)) + x-symbol-8bits))) + (x-symbol-auto-set-variable 'x-symbol-unique (cadddr style)) + (x-symbol-auto-set-variable 'x-symbol-subscripts (nth 4 style)) + (x-symbol-auto-set-variable 'x-symbol-image (nth 5 style)) + (or (and (eq special 'init) (null arg)) + (setq x-symbol-mode new-mode))))) + (if (eq special 'init) + (if x-symbol-mode (x-symbol-mode-internal t)) + (x-symbol-mode-internal (and x-symbol-language + (eq (null old-mode) (and x-symbol-mode t)))) + (and disabled + (eq special 'interactive) + (error (if (stringp disabled) + disabled + "Cannot turn on X-Symbol mode")))))) + +;;;###autoload +(defun turn-on-x-symbol-conditionally () + "Turn on x-symbol mode conditionally, see `x-symbol-mode'. +Call `x-symbol-mode' with a cons for ARG and a non-nil INIT. Used in +`hack-local-variables-hook'." + (x-symbol-mode (and (local-variable-p 'x-symbol-mode (current-buffer)) + (if x-symbol-mode 1 0)) + 'init)) + +;;;###autoload +(defun x-symbol-fontify (&optional beg end) + "Re-fontify region between BEG and END." + (interactive (and (region-active-p) (list (region-beginning) (region-end)))) + (cond ((not font-lock-mode) (turn-on-font-lock)) + ((and (featurep 'xemacs) (boundp 'lazy-shot-mode) lazy-shot-mode) + ;; copied from lazy-shot: + (setq font-lock-fontified + (and lazy-shot-minimum-size + (>= (buffer-size) lazy-shot-minimum-size))) + (lazy-shot-install-extents (point-min) (point-max) + font-lock-fontified)) + ((and (featurep 'xemacs) (boundp 'lazy-lock-mode) lazy-lock-mode) + ;; copied from lazy-lock: + (let ((modified (buffer-modified-p)) (inhibit-read-only t) + (buffer-undo-list t) + ;;deactivate-mark + buffer-file-name buffer-file-truename) + (remove-text-properties (or beg 1) (or end (1+ (buffer-size))) + '(fontified nil)) + (or modified (set-buffer-modified-p nil)))) + (t + (font-lock-fontify-buffer)))) + + +;;;=========================================================================== +;;; comint support +;;;=========================================================================== + +(defun x-symbol-comint-output-filter (dummy) + ;; checkdoc-params: (dummy) + "Decode output of comint's process. +Used as value in `comint-output-filter-functions'." + (and x-symbol-mode x-symbol-language + (save-excursion + (x-symbol-decode-region (if (interactive-p) + comint-last-input-end + comint-last-output-start) + (process-mark (get-buffer-process + (current-buffer))))))) + +(defun x-symbol-comint-send (proc string) + "Encode STRING and send it to process PROC. +Used as value of `comint-input-sender', uses +`x-symbol-orig-comint-input-sender'." + (and x-symbol-mode x-symbol-language + (setq string + (save-excursion + (let ((orig-buffer (current-buffer)) + (selective selective-display)) + (set-buffer (get-buffer-create " x-symbol comint")) + (erase-buffer) + (insert string) + (x-symbol-inherit-from-buffer orig-buffer) + (x-symbol-encode-all) + (setq selective-display selective)) + (buffer-string)))) + (funcall x-symbol-orig-comint-input-sender proc string)) + + +;;;=========================================================================== +;;; Hooks for automatic conversion +;;;=========================================================================== + +;; TODO: for format fns: check whether read-only stuff is still necessary... +;; TODO: check the narrow-to-region stuff + +(defun x-symbol-format-decode (start end) + (if (and x-symbol-mode x-symbol-language) + (save-restriction + (narrow-to-region start end) + (let ((modified (buffer-modified-p)) ; t if `recover-file'! + ;;(buffer-undo-list t) ; do not record changes + ;; we cannot set buffer-undo-list to t even if the previous + ;; value is nil because M-x insert-file as the first command + ;; after reading a file would set the old insert-region + ;; boundaries into the undo-list + (buffer-read-only nil) ; always allow conversion + (inhibit-read-only t) + (first-change-hook nil) ; no `flyspell-mode' here + (after-change-functions nil)) ; no fontification +;;; (and orig-buffer +;;; (not (eq (current-buffer) orig-buffer)) +;;; (x-symbol-inherit-from-buffer orig-buffer)) + (x-symbol-decode-all) + (or modified (set-buffer-modified-p nil)) + (point-max))) + end)) + +(defun x-symbol-format-encode (start end orig-buffer) + (let ((new-buffer (current-buffer))) + (if (eq new-buffer orig-buffer) + (and x-symbol-mode x-symbol-language + (save-restriction + (narrow-to-region start end) + (x-symbol-encode-all))) + (set-buffer orig-buffer) + (and x-symbol-mode x-symbol-language + (if (featurep 'mule) + (let ((cs buffer-file-coding-system)) + (x-symbol-encode-all new-buffer) + (setq buffer-file-coding-system cs)) + (x-symbol-encode-all new-buffer)))))) + +(defun x-symbol-after-insert-file (len) + ;; checkdoc-params: (len) + "Decode tokens, e.g., after \\[vc-register] or \\[vc-next-action]. +Added to `after-insert-file-functions' if +`x-symbol-auto-conversion-method' has value `fast'." + ;; TODO (outdated?, dropped coding): in old XEmacsen, there is no way to know + ;; the start position of the region. If `insert-file-contents' is called + ;; with argument REPLACE being non-nil, it is not always point. Thus, we use + ;; `point-min', except when called from `M-x insert-file'. + + ;; The docstring of `after-insert-file-functions' talks about bytes, but that + ;; seems to be nonsense and doesn't match the coding in lisp/format.el, + ;; must be checked with src/fileio.c. + (and x-symbol-mode x-symbol-language + (if (<= (+ (point) len) (point-max)) + (save-restriction + (narrow-to-region (point) (+ (point) len)) + (let ((origpos (point)) + (modified (buffer-modified-p)) ; t if `recover-file'! + ;;(buffer-undo-list t) ; do not record changes + ;; we cannot set buffer-undo-list to t even if the previous + ;; value is nil because M-x insert-file as the first command + ;; after reading a file would set the old insert-region + ;; boundaries into the undo-list + (buffer-read-only nil) ; always allow conversion + (inhibit-read-only t) + (first-change-hook nil) ; no `flyspell-mode' here + (after-change-functions nil)) ; no fontification + (x-symbol-decode-all) + (goto-char origpos) + (or modified (set-buffer-modified-p nil)) + (setq len (- (point-max) (point-min))))) + (lwarn 'x-symbol 'warning + ;; might leed to quite a few warnings with old XEmacs, get those + "Wrong point position provided for function in `after-insert-file-functions'"))) + len) + +(defun x-symbol-write-region-annotate-function (start end) + ;; checkdoc-params: (start end) + "Encode x-symbol characters using another buffer. +Added to `write-region-annotate-functions' if +`x-symbol-auto-conversion-method' has value `fast'." + (and x-symbol-mode x-symbol-language + (not (equal start "")) ; kludgy feature of `write-region' + ;; Without the test, "x-symbol.el" is loaded twice, the initialization + ;; done twice (resulting in warnings about charsym redefinitions). + ;; Reason: in Emacs, `make-temp-name', used for the value of some var in + ;; "x-symbol-vars.el", required by "x-symbol.el", calls `write-region'. + (let ((selective selective-display)) + ;; at least in XEmacs, this function might be called with both args + ;; nil + (x-symbol-encode-all (get-buffer-create " x-symbol conversion") + (or start (point-min)) (or end (point-max))) + ;; set `selective-display' according to orig buffer + (setq selective-display selective))) + nil) + +(defun x-symbol-write-file-hook () + "Encode x-symbol characters in current buffer. +Added to `write-file-hooks' if `x-symbol-auto-conversion-method' has a +value other than nil or `fast'. Refontifies buffer if +`x-symbol-auto-conversion-method' has value `slowest'." + (and x-symbol-mode x-symbol-language + (let ((buffer-read-only nil) + ;; `buffer-read-only' is only dec/ if `inhibit-read-only' doesn't + ;; exist. TODO: check whether still nec/ in XEmacs-21.1 + (inhibit-read-only t) + (inhibit-modification-hooks t) ; Emacs only: then + ; `after-change-functions' not nec/ + (first-change-hook nil) ; no `flyspell-mode' here + (after-change-functions nil)) ; no fontification! + (widen) ;; Called inside `save-recursion' and `save-restriction'. + ;; TODO: define a common macro in x-symbol-macs.el instead, which can + ;; also be used in `x-symbol-tex-translate-locations', it has an + ;; addition argument for the var `changed' there, with that arg: no + ;; `unwind-protect' + (if (featurep 'xemacs) + (call-with-transparent-undo + (lambda () + (x-symbol-encode-all) ; not the safe version! + (continue-save-buffer))) + (let ((buffer-undo-list nil) + ;; Kludge to prevent undo list truncation: + (undo-limit most-positive-fixnum) ; Emacs + (undo-strong-limit most-positive-fixnum) ; Emacs + (undo-high-threshold -1) ; XEmacs + (undo-threshold -1)) ; XEmacs + (unwind-protect + (progn + (x-symbol-encode-all) ; not the safe version! + (continue-save-buffer)) + (let ((tail buffer-undo-list)) + (setq buffer-undo-list t) + (while tail + (setq tail (primitive-undo (length tail) tail))))))) + (and (eq x-symbol-auto-conversion-method 'slowest) + font-lock-mode + (x-symbol-fontify)) + (set-buffer-modified-p nil) + 'x-symbol-write-file-hook))) ; do not write again + + +;;;=========================================================================== +;;; Init +;;;=========================================================================== + +(defvar x-symbol-modeline-string "" + "String that should appear in the modeline when `x-symbol-mode' is on. +Its value is set by `x-symbol-update-modeline'.") +(make-variable-buffer-local 'x-symbol-modeline-string) + +(defvar x-symbol-mode-map + (let ((m (make-sparse-keymap))) + ;; (substitute-key-definition 'x-symbol-map-autoload 'x-symbol-map + ;; m global-map) + m)) + +(add-minor-mode 'x-symbol-mode 'x-symbol-modeline-string x-symbol-mode-map) +(put 'x-symbol-mode :menu-tag "X-Symbol") + +(defvar x-symbol-early-language-access-alist + '((x-symbol-name "name" nil stringp) + (x-symbol-modes "modes" t listp) + (x-symbol-auto-style "auto-style" require))) + +(defun x-symbol-init-language-accesses (language alist) + "Initialize accesses for token language LANGUAGE according to ALIST. +The symbol property `x-symbol-feature' of LANGUAGE must be set before. +See also `x-symbol-language-access-alist'." + ;;If optional NO-TEST is nil, accesses which do not point to a bound + ;;variable are not set. + (let ((feature (get language 'x-symbol-feature)) + (ok t) + symbol) + (dolist (item alist) + (setq symbol (intern (format "%s-%s" feature (cadr item)))) + (if (not (or (boundp symbol) (eq (caddr item) 'require))) + (or (eq (caddr item) t) ; optional access + (and (caddr item) (not (get language (caddr item)))) + (progn + (lwarn feature 'error + "Token language `%s' does not define `%s'" language symbol) + (setq ok nil)) + (put language (car item) symbol)) + (or (null (cadddr item)) + (caddr item) ; optional access: value nil always ok + (funcall (cadddr item) (symbol-value symbol)) + (progn + (lwarn feature 'error + "Token language `%s' uses illegal type for value of `%s'" + language symbol) + (setq ok nil))) + (put language (car item) symbol))) + ok)) + +;;;###autoload +(defun x-symbol-register-language (language feature &optional modes) + "Register token language LANGUAGE. +FEATURE is a feature which `provide's LANGUAGE. MODES are major modes +which typically use LANGUAGE. Using LANGUAGE's accesses will initialize +LANGUAGE, see `x-symbol-language-value'." + ;; TODO: modes are ignored + ;; set (dolist (mode modes) (put mode 'x-symbol-style (cons language t))) + (unless (get language 'x-symbol-feature) + (put language 'x-symbol-feature feature)) + (unless + (x-symbol-init-language-accesses language + x-symbol-early-language-access-alist) + (error "Registration of X-Symbol language `%s' has failed" language)) +;; (x-symbol-init-language-accesses language '((x-symbol-name . "name"))) + (unless (assq language x-symbol-language-alist) + (setq x-symbol-language-alist + (nconc x-symbol-language-alist + (list (cons language + (symbol-value (get language 'x-symbol-name)))))))) + +;;;###autoload +(defun x-symbol-initialize (&optional arg) + "Initialize package X-Symbol. +See variable `x-symbol-initialize' and function `x-symbol-after-init'. +Also allocate colormap, see `x-symbol-image-colormap-allocation'. +Unless optional argument ARG is non-nil, do not initialize package +X-Symbol twice." + (interactive "P") + (unless (and (get 'x-symbol 'x-symbol-initialized) (null arg)) + (put 'x-symbol 'x-symbol-initialized t) + ;; X-Symbol doesn't make sense without the following. `ctl-arrow' is a + ;; boolean in Emacs, but not in XEmacs: despite its docstring, value t + ;; means the same as 256 (and 255 sometimes, which is probably wrong). + (or (default-value 'ctl-arrow) (setq-default ctl-arrow 'iso-8859/1)) + ;; Token languages ------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'languages x-symbol-initialize)) + (x-symbol-register-language 'tex 'x-symbol-tex) + (x-symbol-register-language 'sgml 'x-symbol-sgml) + (x-symbol-register-language 'bib 'x-symbol-bib) + (x-symbol-register-language 'texi 'x-symbol-texi)) + ;; Global mode ----------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'global x-symbol-initialize)) + (add-hook 'hack-local-variables-hook 'turn-on-x-symbol-conditionally)) + ;; Key bindings ---------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'keys x-symbol-initialize)) + (global-set-key (vector x-symbol-compose-key) 'x-symbol-map-autoload) + (unless (featurep 'xemacs) + (define-key isearch-mode-map (vector x-symbol-compose-key) nil) + ;;(define-key isearch-mode-map [mouse-2] 'isearch-mouse-2) + (define-key isearch-mode-map [menu-bar X-Symbol] nil)) + (global-set-key [(control ?\,)] 'x-symbol-modify-key) + (global-set-key [(control ?\.)] 'x-symbol-rotate-key)) + ;; Font path ------------------------------------------------------------- + (and (or (eq x-symbol-initialize t) + (memq 'font-path x-symbol-initialize)) + x-symbol-font-directory + (file-accessible-directory-p x-symbol-font-directory) + ;; by Jim Radford <radford@robby.caltech.edu>: + (memq (console-type) '(x gtk)) + (if (fboundp 'x-set-font-path) ; XEmacs >= 21.4 + (let ((font-path (x-get-font-path))) + (condition-case nil + (unless (or (member (file-name-as-directory + x-symbol-font-directory) font-path) + (member (directory-file-name + x-symbol-font-directory) font-path)) + (x-set-font-path (nconc font-path + (list x-symbol-font-directory))) + nil) + (t + (lwarn 'x-symbol 'error + "Couldn't add %s to X font path" x-symbol-font-directory) + t))) ; (error t) doesn't work (XEmacs bug?) + ;; This should be commented out until I can figure out how to + ;; get the display name into the -display arg for xset. + (with-temp-buffer + (call-process "xset" nil t nil "q") + (goto-char (point-min)) + (unless (search-forward (directory-file-name + x-symbol-font-directory) nil t) + (not (eq 0 (call-process "xset" nil nil nil "fp+" + x-symbol-font-directory)))))) + (lwarn 'x-symbol 'error + "Couldn't add %s to X font path" x-symbol-font-directory)) + ;; Package fast-lock ----------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'fast-lock x-symbol-initialize)) + (setq fast-lock-save-faces nil)) + ;; Package AucTeX ---------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'auctex x-symbol-initialize)) + (or (fboundp 'x-symbol-tex-error-location) ; esp for preview-latex + (fset 'x-symbol-tex-error-location 'ignore)) + (add-hook 'TeX-translate-location-hook 'x-symbol-tex-error-location) + (add-hook 'TeX-region-hook 'x-symbol-inherit-from-buffer) ; v9.8a+ + (setq LaTeX-math-insert-function 'x-symbol-auctex-math-insert)) ; v9.8a+ + ;; Package RefTeX -------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'reftex x-symbol-initialize)) + (unless (and (boundp 'reftex-translate-to-ascii-function) + (fboundp reftex-translate-to-ascii-function) + (not (eq reftex-translate-to-ascii-function + 'reftex-latin1-to-ascii))) + (setq reftex-translate-to-ascii-function 'x-symbol-translate-to-ascii)) + (add-hook 'reftex-pre-refontification-functions + 'x-symbol-inherit-from-buffer) + (unless (featurep 'mule) + ;; RefTeX might be invoked from a TeX buffer without X-Symbol + (or (fboundp 'x-symbol-nomule-fontify-cstrings) + (fset 'x-symbol-nomule-fontify-cstrings 'ignore)) + (add-hook 'reftex-display-copied-context-hook + 'x-symbol-nomule-fontify-cstrings))) + ;; Miscellaneous --------------------------------------------------------- + (x-symbol-image-set-colormap nil nil) + (if init-file-loaded + (x-symbol-after-init) + (add-hook 'after-init-hook 'x-symbol-after-init)))) + +(defun x-symbol-after-init () + "Late initialization for package X-Symbol. +See function `x-symbol-initialize' and variables `x-symbol-initialize' +and `x-symbol-auto-conversion-method'. Also add elements to +`x-symbol-auto-mode-suffixes' if necessary." + (when x-symbol-auto-conversion-method + (and (eq x-symbol-auto-conversion-method 'auto-slow) + (null (featurep 'crypt)) + (setq x-symbol-auto-conversion-method 'fast)) + (cond ((eq x-symbol-auto-conversion-method 'format) + (or (assq 'x-symbol format-alist) + (push '(x-symbol "X-Symbol" nil + x-symbol-format-decode x-symbol-format-encode + t x-symbol-mode t) + format-alist))) + ((eq x-symbol-auto-conversion-method 'fast) + (add-hook 'after-insert-file-functions + 'x-symbol-after-insert-file t) + ;; If we don't use APPEND for the hook below, we must use APPEND for + ;; the hook above (and v/v). For Emacs-21.2, using APPEND when + ;; inserting is the only correct one, because function + ;; `after-insert-file-set-buffer-file-coding-system', which has been + ;; added to the hook, must run first (BTW, also for format.el...). + (add-hook 'write-region-annotate-functions + 'x-symbol-write-region-annotate-function)) + (t + (add-hook 'write-file-hooks 'x-symbol-write-file-hook)))) + ;; misc user additions to `auto-mode-alist': + (setq x-symbol-auto-mode-suffixes (x-symbol-auto-mode-suffixes + x-symbol-auto-mode-suffixes)) + ;; Package comint ---------------------------------------------------------- + (when (or (eq x-symbol-initialize t) + (memq 'comint x-symbol-initialize)) + (add-hook 'comint-output-filter-functions 'x-symbol-comint-output-filter) + (and (boundp 'comint-input-sender) + (not (eq comint-input-sender 'x-symbol-comint-send)) + (setq x-symbol-orig-comint-input-sender comint-input-sender)) + (setq comint-input-sender 'x-symbol-comint-send)) + ;; Package bib-cite: X-Symbol decoding would overwrite cite highlighting with + ;; normal installation of bib-cite ----------------------------------------- + (when (and (or (eq x-symbol-initialize t) + (memq 'bib-cite x-symbol-initialize)) + (or (and (boundp 'LaTeX-mode-hook) + (memq 'turn-on-bib-cite LaTeX-mode-hook)) + (and (boundp 'latex-mode-hook) + (memq 'turn-on-bib-cite latex-mode-hook)))) + (remove-hook 'LaTeX-mode-hook 'turn-on-bib-cite) + (remove-hook 'latex-mode-hook 'turn-on-bib-cite) + (add-hook 'find-file-hooks 'x-symbol-turn-on-bib-cite))) + + +;;;=========================================================================== +;;; Support for other packages +;;;=========================================================================== + +(defun x-symbol-inherit-from-buffer (&optional parent action) + "Inherit X-Symbol's buffer-local variables from buffer PARENT. +Inherit `x-symbol-mode', `x-symbol-coding', `x-symbol-8bits', +`x-symbol-language', and `x-symbol-subscripts' from PARENT and set +`x-symbol-image' to nil. If PARENT is nil, `orig-buffer' is used if +it is bound. ACTION is ignored." + (and (null parent) (boundp 'orig-buffer) (setq parent orig-buffer)) + ;; I don't care too much that people who use X-Symbol in the master buffer, + ;; but not in the buffer where they invoke M-x TeX-command-region from, won't + ;; have the X-Symbol characters in the "master envelope" decoded... + (if (buffer-live-p (get-buffer parent)) + (let (mode-on coding 8bits unique language subscripts) + (save-excursion + (set-buffer parent) + (setq mode-on x-symbol-mode + coding x-symbol-coding + 8bits x-symbol-8bits + unique x-symbol-unique + language x-symbol-language + subscripts x-symbol-subscripts)) + (setq x-symbol-mode mode-on) + (if (local-variable-p 'x-symbol-coding parent) + (setq x-symbol-coding coding)) + (if (local-variable-p 'x-symbol-8bits parent) + (setq x-symbol-8bits 8bits)) + (if (local-variable-p 'x-symbol-unique parent) + (setq x-symbol-unique unique)) + (if (local-variable-p 'x-symbol-language parent) + (setq x-symbol-language language)) + (if (local-variable-p 'x-symbol-subscripts parent) + (setq x-symbol-subscripts subscripts)) + (setq x-symbol-image nil)))) + +(defun x-symbol-auctex-math-insert (string) + "Insert the character for \\STRING. +Used as value for `LaTeX-math-insert-function'." + (let ((cstring (and x-symbol-mode x-symbol-language + (x-symbol-decode-single-token (concat "\\" string))))) + (if cstring + (insert cstring) + (TeX-insert-macro string)))) + +(defun x-symbol-turn-on-bib-cite () + "Run `turn-on-bib-cite' if we are in `latex-mode'. +Added to `find-file-hooks' if the initialization for X-Symbol has +removed `turn-on-bib-cite' from `LaTeX-mode-hook' or `latex-mode-hook'. +See variable `x-symbol-initialize'." + (if (eq major-mode 'latex-mode) (turn-on-bib-cite))) + +;;; Local IspellPersDict: .ispell_xsymb +;;; x-symbol-hooks.el ends here diff --git a/x-symbol/lisp/x-symbol-xmacs.el b/x-symbol/lisp/x-symbol-xmacs.el new file mode 100644 index 00000000..a87e2d2f --- /dev/null +++ b/x-symbol/lisp/x-symbol-xmacs.el @@ -0,0 +1,183 @@ +;;; x-symbol-xmacs.el --- make package x-symbol work with XEmacs + +;; Copyright (C) 1998-1999, 2001-2002 Free Software Foundation, Inc. +;; +;; Author: Christoph Wedler <wedler@users.sourceforge.net> +;; Maintainer: (Please use `M-x x-symbol-package-bug' to contact the maintainer) +;; Version: 4.4.X +;; Keywords: WYSIWYG, LaTeX, HTML, wp, math, internationalization +;; X-URL: http://x-symbol.sourceforge.net/ + +;; This program 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 program 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 this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; If you want to use package x-symbol, please visit the URL (use +;; \\[x-symbol-package-web]) and read the info (use \\[x-symbol-package-info]). + +;;; Code: + +;;; Release dates: XEmacs-21.1.2 = 14 May 1999, XEmacs-21.1.9 = 13 Feb 2000. + +(provide 'x-symbol-xmacs) +;; the following line can be included AFTER (require 'x-symbol-{mule/nomule}) has been deleted from x-symbol-hooks +;;(eval-when-compile (require 'x-symbol)) ; x-symbol also requires this file + +(cond ((not (and (fboundp 'emacs-version>=) (emacs-version>= 20 3))) + ;; Yes, it probably works with XEmacs-20.2, too, but I do not want to + ;; care about its bug in `string-match': + (error "Package X-Symbol requires XEmacs-21.1.9+")) + ((or (emacs-version>= 21 2) (not x-symbol-warn-of-old-emacs))) + ((< emacs-major-version 21) + (warn "X-Symbol: minor problem in GRID, upgrade to XEmacs-21.1.9+")) + ((or (zerop emacs-minor-version) + ;; 3rd arg for `emacs-version>=' introduced in XEmacs-21.2.15 + (not (and (boundp 'emacs-patch-level) + (>= emacs-patch-level 9)))) + ;; XEmacs-21.1.8 + X-Symbol + abbrev-mode + input method TOKEN => core + (setq-default x-symbol-token-input nil) + (warn "X-Symbol: XEmacs might core, upgrade to XEmacs-21.1.9+"))) + +(when (eq (console-type) 'mswindows) + (unless (emacs-version>= 21 4) + (warn "X-Symbol: might not work correctly, upgrade to XEmacs-21.4+")) + (unless (and (boundp 'x-symbol-default-coding) + (or (null x-symbol-default-coding) + (eq x-symbol-default-coding 'iso-8859-1))) + ;; no idea about XEmacs/NT in a Japanese environment... + (warn "X-Symbol: only limited support with XEmacs-21.4+ on Windows") + (setq x-symbol-default-coding 'iso-8859-1)) + (unless (and (boundp 'x-symbol-latin-force-use) + (eq x-symbol-latin-force-use 'mswindows-user)) + ;; Hm, this isn't a really great situation that all font settings are + ;; useless for MS-Windows... + (setq x-symbol-latin1-fonts + '(("Microsoft Sans Serif:Regular:11::Western" + "Courier New:Regular:11::Western"))) + ;; Latin2 != CP1250, see EMACS/lisp/international/codepage.el + (setq x-symbol-latin2-fonts nil) + ;; '(("Microsoft Sans Serif:Regular:11::Central European" + ;; "Courier New:Regular:11::Central European"))) + ;; Latina-3 from <http://www.esperanto.se/html/latina.html> does not work, + ;; I have no time to download and test various others... + (setq x-symbol-latin3-fonts nil) + (setq x-symbol-latin5-fonts + '(("Microsoft Sans Serif:Regular:11::Turkish" + "Courier New:Regular:11::Turkish"))) + (setq x-symbol-latin9-fonts nil) + (setq x-symbol-xsymb0-fonts + '(("Symbol:Regular:11::Symbol"))) + (setq x-symbol-xsymb1-fonts nil) + (make-face 'x-symbol-heading-face) + (set-face-font 'x-symbol-heading-face + "Microsoft Sans Serif:Bold:10::Western") + (set-face-foreground 'x-symbol-heading-face "green4") + (set-face-underline-p 'x-symbol-heading-face t) + (make-face 'x-symbol-info-face) + (set-face-font 'x-symbol-info-face + "Microsoft Sans Serif:Regular:10::Western") + (set-face-foreground 'x-symbol-info-face "green4") + (make-face 'x-symbol-emph-info-face) + (set-face-font 'x-symbol-emph-info-face + "Microsoft Sans Serif:Regular:10::Western") + (set-face-foreground 'x-symbol-emph-info-face "red4"))) + + +;;;=========================================================================== +;;; Fixing non X-Symbol induced annoyances +;;;=========================================================================== + +(defun x-symbol-paren-reset-mode () + (make-local-variable 'paren-mode) + (setq paren-mode nil)) +(add-hook 'list-mode-hook 'x-symbol-paren-reset-mode) + + +;;;=========================================================================== +;;; Autoloads +;;;=========================================================================== + +(autoload 'browse-url "browse-url" nil t) + + +;;;=========================================================================== +;;; Bug workarounds +;;;=========================================================================== + +;; Workaround for XEmacs bug (since XEmacs-20) with char syntax `inherit': the +;; following should be executed before(!) the AucTeX's syntax table is created. +(unless (or (featurep 'mule) (emacs-version>= 21 4)) ; OK in XEmacs-21.4.5 + (modify-syntax-entry ?\237 "\\" (standard-syntax-table)) + (modify-syntax-entry ?\236 "\\" (standard-syntax-table)) + (modify-syntax-entry ?\235 "\\" (standard-syntax-table)) + (modify-syntax-entry ?\234 "\\" (standard-syntax-table)) + (modify-syntax-entry ?\233 "\\" (standard-syntax-table)) + (modify-syntax-entry ?\232 "\\" (standard-syntax-table)) + ;; Add appropriately if more csets (fonts) are added. + ) + + +;;;=========================================================================== +;;; X-Symbol functions that depend on the Emacs flavor +;;;=========================================================================== + +(defvar x-symbol-xmacs-default-face-fonts nil) + +(defalias 'x-symbol-directory-files 'directory-files) + +(defun x-symbol-event-in-current-buffer () + (or (null current-mouse-event) + (eq (event-buffer current-mouse-event) (current-buffer)))) + +(defun x-symbol-create-image (file type) + (make-image-instance (vector (or type 'autodetect) ; autodetect is not clever + :file file) + nil nil t)) + +(defalias 'x-symbol-make-glyph 'make-glyph) + +(defalias 'x-symbol-set-glyph-image 'set-glyph-image) + +(defun x-symbol-set-face-font (face font charsets default) + "Set font to use for text using FACE and CHARSETS." + (if default + (progn + (push (cons face font) x-symbol-xmacs-default-face-fonts) + (set-face-property face 'font font)) + (set-face-property face 'font font nil '(mule-fonts) 'prepend) + (let ((dfont (assq face x-symbol-xmacs-default-face-fonts))) + (if dfont (set-face-property face 'font (cdr dfont)))))) + +(defun x-symbol-event-matches-key-specifier-p (event specifier) + "Return non-nil if EVENT matches key or mouse SPECIFIER. +This is like `event-matches-key-specifier-p', except that it also works +for mouse events." + (if (mouse-event-p event) + (equal (aref (events-to-keys (vector event)) 0) specifier) + (condition-case nil + (event-matches-key-specifier-p event specifier) + (error nil)))) + +(defun x-symbol-window-width (&optional window) + "Return the number of display columns in WINDOW (corrected version)." + (or window (setq window (selected-window))) + (/ (- (window-pixel-width window) + (window-left-margin-pixel-width window) ; ?? + (window-right-margin-pixel-width window) ; ?? + (specifier-instance scrollbar-width window)) + (font-instance-width (face-font-instance 'default window)))) + +;;; Local IspellPersDict: .ispell_xsymb +;;; x-symbol-xmacs.el ends here |