yatex

annotate yatexlib.el @ 187:2f91947a43a1

YaTeX-end-environment should not warn if opening structure is coming before closing one.
author yuuji@gentei.org
date Thu, 15 Dec 2011 13:39:36 +0900
parents 67b1e094e151
children cf7352dfa40c
rev   line source
yuuji@23 1 ;;; -*- Emacs-Lisp -*-
yuuji@64 2 ;;; YaTeX and yahtml common libraries, general functions and definitions
yuuji@23 3 ;;; yatexlib.el
yuuji@88 4 ;;; (c)1994-2009 by HIROSE Yuuji.[yuuji@yatex.org]
yuuji@187 5 ;;; Last modified Thu Dec 15 13:37:26 2011 on firestorm
yuuji@23 6 ;;; $Id$
yuuji@23 7
yuuji@64 8 ;; General variables
yuuji@64 9 (defvar YaTeX-dos (memq system-type '(ms-dos windows-nt OS/2)))
yuuji@79 10 (defvar YaTeX-macos (memq system-type '(darwin)))
yuuji@64 11 (defvar YaTeX-emacs-19 (>= (string-to-int emacs-version) 19))
yuuji@64 12 (defvar YaTeX-emacs-20 (>= (string-to-int emacs-version) 20))
yuuji@72 13 (defvar YaTeX-emacs-21 (>= (string-to-int emacs-version) 21))
yuuji@64 14 (defvar YaTeX-user-completion-table
yuuji@64 15 (if YaTeX-dos "~/_yatexrc" "~/.yatexrc")
yuuji@64 16 "*Default filename in which user completion table is saved.")
yuuji@64 17
yuuji@72 18 (defvar YaTeX-display-color-p
yuuji@72 19 (or (and (fboundp 'display-color-p) (display-color-p))
yuuji@72 20 (and (fboundp 'device-class)
yuuji@72 21 (eq 'color (device-class (selected-device))))
yuuji@72 22 window-system) ; falls down lazy check..
yuuji@72 23 "Current display's capability of expressing colors.")
yuuji@72 24
yuuji@79 25 (defvar YaTeX-japan
yuuji@79 26 (or (boundp 'NEMACS)
yuuji@79 27 (boundp 'MULE)
yuuji@79 28 (and (boundp 'current-language-environment)
yuuji@79 29 (string-match "[Jj]apanese" current-language-environment)))
yuuji@64 30 "Whether yatex mode is running on Japanese environment or not.")
yuuji@64 31
yuuji@70 32 ;; autoload from yahtml.el
yuuji@70 33 (autoload 'yahtml-inner-environment-but "yahtml" "yahtml internal func." t)
yuuji@70 34
yuuji@80 35 (defvar latex-message-kanji-code 2
yuuji@80 36 "*Kanji coding system latex command types out.
yuuji@80 37 1 = Shift JIS, 2 = JIS, 3 = EUC. 4 = UTF-8")
yuuji@80 38
yuuji@64 39 (defvar YaTeX-kanji-code-alist
yuuji@64 40 (cond
yuuji@64 41 ((boundp '*junet*)
yuuji@77 42 (list '(0 . *noconv*)
yuuji@77 43 (cons
yuuji@64 44 1
yuuji@79 45 (cond
yuuji@79 46 (YaTeX-dos (if (boundp '*sjis-dos*) *sjis-dos* *sjis*dos))
yuuji@79 47 (YaTeX-macos (if (boundp '*sjis-mac*) *sjis-mac* *sjis*mac))
yuuji@79 48 (t *sjis*)))
yuuji@64 49 '(2 . *junet*) '(3 . *euc-japan*)))
yuuji@80 50 ((and YaTeX-emacs-20 (featurep 'mule))
yuuji@64 51 ;;(cdr-safe(assq 'coding-system (assoc "Japanese" language-info-alist)))
yuuji@77 52 (list '(0 . no-conversion)
yuuji@77 53 (cons
yuuji@64 54 1 (cond (YaTeX-dos 'shift_jis-dos)
yuuji@79 55 (YaTeX-macos 'shift_jis-mac)
yuuji@64 56 ((member 'shift_jis (coding-system-list)) 'shift_jis-unix)
yuuji@64 57 (t 'sjis)))
yuuji@68 58 '(2 . iso-2022-jp-unix)
yuuji@80 59 '(3 . euc-jp-unix)
yuuji@80 60 '(4 . utf-8))))
yuuji@64 61 "Kanji-code expression translation table.")
yuuji@64 62 (defvar YaTeX-inhibit-prefix-letter nil
yuuji@64 63 "*T for changing key definitions from [prefix] Letter to [prefix] C-Letter.")
yuuji@64 64
yuuji@64 65 (defvar YaTeX-no-begend-shortcut nil
yuuji@64 66 "*T for disabling shortcut of begin-type completion, [prefix] b d, etc.")
yuuji@64 67
yuuji@64 68 (defvar YaTeX-default-pop-window-height 10
yuuji@64 69 "Default typesetting buffer height.
yuuji@64 70 If integer, sets the window-height of typesetting buffer.
yuuji@64 71 If string, sets the percentage of it.
yuuji@64 72 If nil, use default pop-to-buffer.")
yuuji@64 73
yuuji@64 74 (defvar YaTeX-create-file-prefix-g nil
yuuji@64 75 "*Non-nil creates new file when [prefix] g on \\include{foo}.")
yuuji@64 76
yuuji@64 77 (defvar YaTeX-nervous t
yuuji@64 78 "*If you are nervous about maintenance of yatexrc, set this value to T.
yuuji@64 79 And you will have the local dictionary.")
yuuji@64 80
yuuji@72 81 (defvar YaTeX-use-italic-bold (string< "20" emacs-version)
yuuji@72 82 "*Non-nil tries to find italic/bold fontset.
yuuji@72 83 This variable is effective when font-lock is used.
yuuji@72 84 \it, \bf 内部での日本語が□になってしまう場合はこれをnilにして下さい。")
yuuji@72 85
yuuji@64 86 ;----------- work variables ----------------------------------------
yuuji@80 87 (defvar YaTeX-minibuffer-completion-map nil
yuuji@80 88 "Minibuffer completion key map that allows comma completion.")
yuuji@80 89 (if YaTeX-minibuffer-completion-map nil
yuuji@80 90 (setq YaTeX-minibuffer-completion-map
yuuji@80 91 (copy-keymap minibuffer-local-completion-map))
yuuji@80 92 (define-key YaTeX-minibuffer-completion-map " "
yuuji@80 93 'YaTeX-minibuffer-complete)
yuuji@80 94 (define-key YaTeX-minibuffer-completion-map "\t"
yuuji@80 95 'YaTeX-minibuffer-complete))
yuuji@80 96
yuuji@64 97 (defvar YaTeX-typesetting-mode-map nil
yuuji@69 98 "Keymap used in YaTeX typesetting buffer")
yuuji@69 99
yuuji@64 100 (if YaTeX-typesetting-mode-map nil
yuuji@64 101 (setq YaTeX-typesetting-mode-map (make-keymap))
yuuji@64 102 ;(suppress-keymap YaTeX-typesetting-mode-map t)
yuuji@64 103 (define-key YaTeX-typesetting-mode-map " " 'YaTeX-jump-error-line)
yuuji@64 104 (define-key YaTeX-typesetting-mode-map "\C-m" 'YaTeX-send-string)
yuuji@64 105 (define-key YaTeX-typesetting-mode-map "1" 'delete-other-windows)
yuuji@64 106 (define-key YaTeX-typesetting-mode-map "0" 'delete-window)
yuuji@64 107 (define-key YaTeX-typesetting-mode-map "q" 'delete-window))
yuuji@64 108
yuuji@64 109 (defvar YaTeX-parent-file nil
yuuji@64 110 "*Main LaTeX source file name used when %#! expression doesn't exist.")
yuuji@64 111 (make-variable-buffer-local 'YaTeX-parent-file)
yuuji@64 112
yuuji@64 113 ;---------- Define default key bindings on YaTeX mode map ----------
yuuji@64 114 ;;;###autoload
yuuji@64 115 (defun YaTeX-define-key (key binding &optional map)
yuuji@64 116 "Define key on YaTeX-prefix-map."
yuuji@64 117 (if YaTeX-inhibit-prefix-letter
yuuji@64 118 (let ((c (aref key 0)))
yuuji@64 119 (cond
yuuji@64 120 ((and (>= c ?a) (<= c ?z)) (aset key 0 (1+ (- c ?a))))
yuuji@64 121 ((and (>= c ?A) (<= c ?Z) (numberp YaTeX-inhibit-prefix-letter))
yuuji@64 122 (aset key 0 (1+ (- c ?A))))
yuuji@64 123 (t nil))))
yuuji@64 124 (define-key (or map YaTeX-prefix-map) key binding))
yuuji@64 125
yuuji@64 126 ;;;###autoload
yuuji@64 127 (defun YaTeX-local-table-symbol (symbol)
yuuji@64 128 "Return the lisp symbol which keeps local completion table of SYMBOL."
yuuji@64 129 (intern (concat "YaTeX$"
yuuji@64 130 default-directory
yuuji@64 131 (symbol-name symbol))))
yuuji@64 132
yuuji@64 133 ;;;###autoload
yuuji@64 134 (defun YaTeX-sync-local-table (symbol)
yuuji@64 135 "Synchronize local variable SYMBOL.
yuuji@64 136 Copy its corresponding directory dependent completion table to SYMBOL."
yuuji@64 137 (if (boundp (YaTeX-local-table-symbol symbol))
yuuji@64 138 (set symbol (symbol-value (YaTeX-local-table-symbol symbol)))))
yuuji@64 139
yuuji@64 140 (defvar YaTeX-user-table-is-read nil
yuuji@64 141 "Flag that means whether user completion table has been read or not.")
yuuji@64 142 ;;;###autoload
yuuji@64 143 (defun YaTeX-read-user-completion-table (&optional forcetoread)
yuuji@64 144 "Append user completion table of LaTeX macros"
yuuji@80 145 (interactive)
yuuji@64 146 (let*((user-table (expand-file-name YaTeX-user-completion-table))
yuuji@64 147 (local-table (expand-file-name (file-name-nondirectory user-table)))
yuuji@64 148 var localvar localbuf (curbuf (current-buffer)) sexp)
yuuji@64 149 (if YaTeX-user-table-is-read nil
yuuji@64 150 (message "Loading user completion table")
yuuji@64 151 (if (file-exists-p user-table) (load-file user-table)
yuuji@64 152 (message "Welcome to the field of YaTeX. I'm glad to see you!")))
yuuji@64 153 (setq YaTeX-user-table-is-read t)
yuuji@64 154 (cond
yuuji@64 155 ((file-exists-p local-table)
yuuji@64 156 (set-buffer (setq localbuf (find-file-noselect local-table)))
yuuji@64 157 (widen)
yuuji@64 158 (goto-char (point-min))
yuuji@80 159 (while (re-search-forward "(setq \\([^ \t\n]+\\)" nil t)
yuuji@64 160 (setq var (intern (buffer-substring
yuuji@64 161 (match-beginning 1) (match-end 1)))
yuuji@64 162 localvar (YaTeX-local-table-symbol var))
yuuji@64 163 (goto-char (match-beginning 0))
yuuji@64 164 (setq sexp (buffer-substring (point)
yuuji@64 165 (progn (forward-sexp) (point))))
yuuji@64 166 (set-buffer curbuf)
yuuji@64 167 (or (assq var (buffer-local-variables)) (make-local-variable var))
yuuji@64 168 (eval (read sexp))
yuuji@64 169 (or (and (boundp localvar)
yuuji@64 170 (symbol-value localvar)
yuuji@64 171 (not forcetoread))
yuuji@64 172 (set localvar (symbol-value var)))
yuuji@64 173 (set-buffer localbuf))
yuuji@64 174 (kill-buffer localbuf)))
yuuji@64 175 (set-buffer curbuf)))
yuuji@64 176
yuuji@64 177 ;;;###autoload
yuuji@64 178 (defun YaTeX-reload-dictionary ()
yuuji@64 179 "Reload local dictionary.
yuuji@64 180 Use this function after editing ./.yatexrc."
yuuji@64 181 (interactive)
yuuji@64 182 (let ((YaTeX-user-table-is-read nil))
yuuji@64 183 (YaTeX-read-user-completion-table t)))
yuuji@64 184
yuuji@64 185 ;;;###autoload
yuuji@64 186 (defun YaTeX-lookup-table (word type)
yuuji@64 187 "Lookup WORD in completion table whose type is TYPE.
yuuji@64 188 This function refers the symbol tmp-TYPE-table, user-TYPE-table, TYPE-table.
yuuji@64 189 Typically, TYPE is one of 'env, 'section, 'fontsize, 'singlecmd."
yuuji@64 190 (if (symbolp type) (setq type (symbol-name type)))
yuuji@64 191 (or (assoc word (symbol-value (intern (concat "tmp-" type "-table"))))
yuuji@64 192 (assoc word (symbol-value (intern (concat "user-" type "-table"))))
yuuji@64 193 (assoc word (symbol-value (intern (concat type "-table"))))))
yuuji@64 194
yuuji@64 195 ;;;###autoload
yuuji@64 196 (defun YaTeX-update-table (vallist default-table user-table local-table)
yuuji@64 197 "Update completion table if the car of VALLIST is not in current tables.
yuuji@64 198 Second argument DEFAULT-TABLE is the quoted symbol of default completion
yuuji@64 199 table, third argument USER-TABLE is user table which will be saved in
yuuji@64 200 YaTeX-user-completion-table, fourth argument LOCAL-TABLE should have the
yuuji@64 201 completion which is valid during current Emacs's session. If you
yuuji@64 202 want to make LOCAL-TABLE valid longer span (but restrict in this directory)
yuuji@64 203 create the file in current directory which has the same name with
yuuji@64 204 YaTeX-user-completion-table."
yuuji@64 205 (let ((car-v (car vallist)) key answer
yuuji@64 206 (file (file-name-nondirectory YaTeX-user-completion-table)))
yuuji@64 207 (cond
yuuji@64 208 ((assoc car-v (symbol-value default-table))
yuuji@64 209 nil) ;Nothing to do
yuuji@64 210 ((setq key (assoc car-v (symbol-value user-table)))
yuuji@64 211 (if (equal (cdr vallist) (cdr key)) nil
yuuji@64 212 ;; if association hits, but contents differ.
yuuji@64 213 (message
yuuji@64 214 "%s's attributes turned into %s" (car vallist) (cdr vallist))
yuuji@64 215 (set user-table (delq key (symbol-value user-table)))
yuuji@64 216 (set user-table (cons vallist (symbol-value user-table)))
yuuji@64 217 (YaTeX-update-dictionary
yuuji@64 218 YaTeX-user-completion-table user-table "user")))
yuuji@64 219 ((setq key (assoc car-v (symbol-value local-table)))
yuuji@64 220 (if (equal (cdr vallist) (cdr key)) nil
yuuji@64 221 (message
yuuji@64 222 "%s's attributes turned into %s" (car vallist) (cdr vallist))
yuuji@64 223 (set local-table (delq key (symbol-value local-table)))
yuuji@64 224 (set local-table (cons vallist (symbol-value local-table)))
yuuji@64 225 (set (YaTeX-local-table-symbol local-table) (symbol-value local-table))
yuuji@64 226 (YaTeX-update-dictionary file local-table)))
yuuji@64 227 ;; All of above cases, there are some completion in tables.
yuuji@64 228 ;; Then update tables.
yuuji@64 229 (t
yuuji@64 230 (if (not YaTeX-nervous)
yuuji@64 231 (setq answer "u")
yuuji@64 232 (message
yuuji@64 233 (cond
yuuji@64 234 (YaTeX-japan
yuuji@68 235 "`%s'の登録先: U)ユーザ辞書 L)ローカル辞書 N)メモリ D)しない")
yuuji@64 236 (t
yuuji@64 237 "Register `%s' into: U)serDic L)ocalDic N)one D)iscard"))
yuuji@64 238 (if (> (length car-v) 23)
yuuji@68 239 (concat (substring car-v 0 10) "..." (substring car-v -9))
yuuji@64 240 car-v))
yuuji@64 241 (setq answer (char-to-string (read-char))))
yuuji@64 242 (cond
yuuji@64 243 ((string-match answer "uy")
yuuji@64 244 (set user-table (cons vallist (symbol-value user-table)))
yuuji@64 245 (YaTeX-update-dictionary YaTeX-user-completion-table user-table "user")
yuuji@64 246 )
yuuji@64 247 ((string-match answer "tl")
yuuji@64 248 (set local-table (cons vallist (symbol-value local-table)))
yuuji@64 249 (set (YaTeX-local-table-symbol local-table) (symbol-value local-table))
yuuji@64 250 (YaTeX-update-dictionary file local-table))
yuuji@64 251 ((string-match answer "d") nil) ;discard it
yuuji@64 252 (t (set default-table
yuuji@64 253 (cons vallist (symbol-value default-table)))))))))
yuuji@64 254
yuuji@64 255 ;;;###autoload
yuuji@64 256 (defun YaTeX-cplread-with-learning
yuuji@64 257 (prom default-table user-table local-table
yuuji@64 258 &optional pred reqmatch init hsym)
yuuji@64 259 "Completing read with learning.
yuuji@64 260 Do a completing read with prompt PROM. Completion table is what
yuuji@64 261 DEFAULT-TABLE, USER-TABLE, LOCAL table are appended in reverse order.
yuuji@64 262 Note that these tables are passed by the symbol.
yuuji@64 263 Optional arguments PRED, REQMATH and INIT are passed to completing-read
yuuji@64 264 as its arguments PREDICATE, REQUIRE-MATCH and INITIAL-INPUT respectively.
yuuji@64 265 If optional 8th argument HSYM, history symbol, is passed, use it as
yuuji@64 266 history list variable."
yuuji@64 267 (YaTeX-sync-local-table local-table)
yuuji@64 268 (let*((table (append (symbol-value local-table)
yuuji@64 269 (symbol-value user-table)
yuuji@64 270 (symbol-value default-table)))
yuuji@64 271 (word (completing-read-with-history
yuuji@64 272 prom table pred reqmatch init hsym)))
yuuji@64 273 (if (and (string< "" word) (not (assoc word table)))
yuuji@64 274 (YaTeX-update-table (list word) default-table user-table local-table))
yuuji@64 275 word))
yuuji@64 276
yuuji@64 277 ;;;###autoload
yuuji@64 278 (defun YaTeX-update-dictionary (file symbol &optional type)
yuuji@64 279 (let ((local-table-buf (find-file-noselect file))
yuuji@64 280 (name (symbol-name symbol))
yuuji@64 281 (value (symbol-value symbol)))
yuuji@64 282 (save-excursion
yuuji@64 283 (message "Updating %s dictionary..." (or type "local"))
yuuji@64 284 (set-buffer local-table-buf)
yuuji@64 285 (goto-char (point-max))
yuuji@64 286 (search-backward (concat "(setq " name) nil t)
yuuji@64 287 (delete-region (point) (progn (forward-sexp) (point)))
yuuji@64 288 (delete-blank-lines)
yuuji@64 289 (insert "(setq " name " '(\n")
yuuji@64 290 (mapcar '(lambda (s)
yuuji@64 291 (insert (format "%s\n" (prin1-to-string s))))
yuuji@64 292 value)
yuuji@64 293 (insert "))\n\n")
yuuji@64 294 (delete-blank-lines)
yuuji@64 295 (basic-save-buffer)
yuuji@64 296 (kill-buffer local-table-buf)
yuuji@64 297 (message "Updating %s dictionary...Done" (or type "local")))))
yuuji@64 298
yuuji@64 299 ;;;###autoload
yuuji@64 300 (defun YaTeX-define-begend-key-normal (key env &optional map)
yuuji@64 301 "Define short cut YaTeX-make-begin-end key."
yuuji@64 302 (YaTeX-define-key
yuuji@64 303 key
yuuji@64 304 (list 'lambda '(arg) '(interactive "P")
yuuji@64 305 (list 'YaTeX-insert-begin-end env 'arg))
yuuji@64 306 map))
yuuji@64 307
yuuji@64 308 ;;;###autoload
yuuji@64 309 (defun YaTeX-define-begend-region-key (key env &optional map)
yuuji@64 310 "Define short cut YaTeX-make-begin-end-region key."
yuuji@64 311 (YaTeX-define-key key (list 'lambda nil '(interactive)
yuuji@64 312 (list 'YaTeX-insert-begin-end env t)) map))
yuuji@64 313
yuuji@64 314 ;;;###autoload
yuuji@64 315 (defun YaTeX-define-begend-key (key env &optional map)
yuuji@86 316 "Define short cut key for begin type completion.
yuuji@86 317 Define both strokes for normal and region mode.
yuuji@86 318 To customize YaTeX, user should use this function."
yuuji@64 319 (YaTeX-define-begend-key-normal key env map)
yuuji@64 320 (if YaTeX-inhibit-prefix-letter nil
yuuji@64 321 (YaTeX-define-begend-region-key
yuuji@64 322 (concat (upcase (substring key 0 1)) (substring key 1)) env)))
yuuji@64 323
yuuji@23 324 ;;;###autoload
yuuji@23 325 (defun YaTeX-search-active-forward (string cmntrx &optional bound err cnt func)
yuuji@23 326 "Search STRING which is not commented out by CMNTRX.
yuuji@23 327 Optional arguments after BOUND, ERR, CNT are passed literally to search-forward
yuuji@23 328 or search-backward.
yuuji@23 329 Optional sixth argument FUNC changes search-function."
yuuji@49 330 (let ((sfunc (or func 'search-forward)) found md)
yuuji@23 331 (while (and (prog1
yuuji@23 332 (setq found (funcall sfunc string bound err cnt))
yuuji@23 333 (setq md (match-data)))
yuuji@23 334 (or
yuuji@64 335 (and (eq major-mode 'yatex-mode)
yuuji@64 336 (YaTeX-in-verb-p (match-beginning 0)))
yuuji@23 337 (save-excursion
yuuji@72 338 (goto-char (match-beginning 0))
yuuji@23 339 (beginning-of-line)
yuuji@23 340 (re-search-forward cmntrx (match-beginning 0) t)))))
yuuji@23 341 (store-match-data md)
yuuji@69 342 found))
yuuji@23 343
yuuji@23 344 (defun YaTeX-re-search-active-forward (regexp cmntrx &optional bound err cnt)
yuuji@23 345 "Search REGEXP backward which is not commented out by regexp CMNTRX.
yuuji@23 346 See also YaTeX-search-active-forward."
yuuji@69 347 (YaTeX-search-active-forward regexp cmntrx bound err cnt 're-search-forward))
yuuji@69 348
yuuji@23 349 (defun YaTeX-search-active-backward (string cmntrx &optional bound err cnt)
yuuji@23 350 "Search STRING backward which is not commented out by regexp CMNTRX.
yuuji@23 351 See also YaTeX-search-active-forward."
yuuji@69 352 (YaTeX-search-active-forward string cmntrx bound err cnt 'search-backward))
yuuji@69 353
yuuji@23 354 (defun YaTeX-re-search-active-backward (regexp cmntrx &optional bound err cnt)
yuuji@23 355 "Search REGEXP backward which is not commented out by regexp CMNTRX.
yuuji@23 356 See also YaTeX-search-active-forward."
yuuji@69 357 (YaTeX-search-active-forward
yuuji@69 358 regexp cmntrx bound err cnt 're-search-backward))
yuuji@23 359
yuuji@80 360 (defun YaTeX-relative-path-p (path)
yuuji@80 361 "Return non-nil if PATH is not absolute one."
yuuji@80 362 (let ((md (match-data)))
yuuji@80 363 (unwind-protect
yuuji@80 364 (not (string-match "^\\(/\\|[a-z]:\\|\\\\\\).*/" file))
yuuji@80 365 (store-match-data md))))
yuuji@80 366
yuuji@23 367 ;;;###autoload
yuuji@23 368 (defun YaTeX-switch-to-buffer (file &optional setbuf)
yuuji@23 369 "Switch to buffer if buffer exists, find file if not.
yuuji@23 370 Optional second arg SETBUF t make use set-buffer instead of switch-to-buffer."
yuuji@23 371 (interactive "Fswitch to file: ")
yuuji@70 372 (if (bufferp file)
yuuji@70 373 (setq file (buffer-file-name file))
yuuji@80 374 (and (YaTeX-relative-path-p file)
yuuji@70 375 (eq major-mode 'yatex-mode)
yuuji@70 376 YaTeX-search-file-from-top-directory
yuuji@70 377 (save-excursion
yuuji@70 378 (YaTeX-visit-main t)
yuuji@70 379 (setq file (expand-file-name file)))))
yuuji@52 380 (let (buf (hilit-auto-highlight (not setbuf)))
yuuji@52 381 (cond
yuuji@52 382 ((setq buf (get-file-buffer file))
yuuji@52 383 (funcall (if setbuf 'set-buffer 'switch-to-buffer)
yuuji@52 384 (get-file-buffer file))
yuuji@52 385 buf)
yuuji@52 386 ((or YaTeX-create-file-prefix-g (file-exists-p file))
yuuji@52 387 (or ;find-file returns nil but set current-buffer...
yuuji@52 388 (if setbuf (set-buffer (find-file-noselect file))
yuuji@52 389 (find-file file))
yuuji@52 390 (current-buffer)))
yuuji@52 391 (t (message "%s was not found in this directory." file)
yuuji@69 392 nil))))
yuuji@23 393
yuuji@23 394 ;;;###autoload
yuuji@23 395 (defun YaTeX-switch-to-buffer-other-window (file)
yuuji@23 396 "Switch to buffer if buffer exists, find file if not."
yuuji@23 397 (interactive "Fswitch to file: ")
yuuji@70 398 (and (eq major-mode 'yatex-mode)
yuuji@70 399 (stringp file)
yuuji@80 400 (YaTeX-relative-path-p file)
yuuji@70 401 YaTeX-search-file-from-top-directory
yuuji@70 402 (save-excursion
yuuji@70 403 (YaTeX-visit-main t)
yuuji@70 404 (setq file (expand-file-name file))))
yuuji@52 405 (if (bufferp file) (setq file (buffer-file-name file)))
yuuji@52 406 (cond
yuuji@52 407 ((get-file-buffer file)
yuuji@52 408 (switch-to-buffer-other-window (get-file-buffer file))
yuuji@52 409 t)
yuuji@52 410 ((or YaTeX-create-file-prefix-g (file-exists-p file))
yuuji@52 411 (find-file-other-window file) t)
yuuji@52 412 (t (message "%s was not found in this directory." file)
yuuji@69 413 nil)))
yuuji@23 414
yuuji@70 415 (defun YaTeX-get-file-buffer (file)
yuuji@70 416 "Return the FILE's buffer.
yuuji@70 417 Base directory is that of main file or current directory."
yuuji@70 418 (let (dir main (cdir default-directory))
yuuji@70 419 (or (and (eq major-mode 'yatex-mode)
yuuji@70 420 YaTeX-search-file-from-top-directory
yuuji@70 421 (save-excursion
yuuji@70 422 (YaTeX-visit-main t)
yuuji@70 423 (get-file-buffer file)))
yuuji@70 424 (get-file-buffer file))))
yuuji@70 425
yuuji@23 426 (defun YaTeX-replace-format-sub (string format repl)
yuuji@23 427 (let ((beg (or (string-match (concat "^\\(%" format "\\)") string)
yuuji@23 428 (string-match (concat "[^%]\\(%" format "\\)") string)))
yuuji@23 429 (len (length format)))
yuuji@23 430 (if (null beg) string ;no conversion
yuuji@23 431 (concat
yuuji@70 432 (substring string 0 (match-beginning 1)) (or repl "")
yuuji@69 433 (substring string (match-end 1))))))
yuuji@23 434
yuuji@23 435 ;;;###autoload
yuuji@23 436 (defun YaTeX-replace-format (string format repl)
yuuji@23 437 "In STRING, replace first appearance of FORMAT to REPL as if
yuuji@23 438 function `format' does. FORMAT does not contain `%'"
yuuji@80 439 (let ((ans string) (case-fold-search nil))
yuuji@23 440 (while (not (string=
yuuji@23 441 ans (setq string (YaTeX-replace-format-sub ans format repl))))
yuuji@23 442 (setq ans string))
yuuji@69 443 string))
yuuji@23 444
yuuji@23 445 ;;;###autoload
yuuji@70 446 (defun YaTeX-replace-formats (string replace-list)
yuuji@70 447 (let ((list replace-list))
yuuji@70 448 (while list
yuuji@70 449 (setq string (YaTeX-replace-format
yuuji@70 450 string (car (car list)) (cdr (car list)))
yuuji@70 451 list (cdr list)))
yuuji@70 452 string))
yuuji@70 453
yuuji@70 454 ;;;###autoload
yuuji@23 455 (defun YaTeX-replace-format-args (string &rest args)
yuuji@23 456 "Translate the argument mark #1, #2, ... #n in the STRING into the
yuuji@23 457 corresponding real arguments ARGS."
yuuji@23 458 (let ((argp 1))
yuuji@23 459 (while args
yuuji@23 460 (setq string
yuuji@23 461 (YaTeX-replace-format string (int-to-string argp) (car args)))
yuuji@23 462 (setq args (cdr args) argp (1+ argp))))
yuuji@69 463 string)
yuuji@23 464
yuuji@23 465 ;;;###autoload
yuuji@23 466 (defun rindex (string char)
yuuji@23 467 (let ((pos (1- (length string)))(index -1))
yuuji@174 468 (catch 'rindex
yuuji@174 469 (while (>= pos 0)
yuuji@174 470 (cond
yuuji@174 471 ((= (aref string pos) char)
yuuji@174 472 (throw 'rindex pos))
yuuji@174 473 (t (setq pos (1- pos))))))))
yuuji@64 474
yuuji@64 475 ;;;###autoload
yuuji@64 476 (defun point-beginning-of-line ()
yuuji@64 477 (save-excursion (beginning-of-line)(point)))
yuuji@64 478
yuuji@64 479 ;;;###autoload
yuuji@64 480 (defun point-end-of-line ()
yuuji@64 481 (save-excursion (end-of-line)(point)))
yuuji@64 482
yuuji@23 483
yuuji@23 484 ;;;###autoload
yuuji@23 485 (defun YaTeX-showup-buffer (buffer &optional func select)
yuuji@23 486 "Make BUFFER show up in certain window (but current window)
yuuji@23 487 that gives the maximum value by the FUNC. FUNC should take an argument
yuuji@23 488 of its window object. Non-nil for optional third argument SELECT selects
yuuji@49 489 that window. This function never selects minibuffer window."
yuuji@86 490 (or (and (if (and YaTeX-emacs-19 select window-system)
yuuji@47 491 (get-buffer-window buffer t)
yuuji@47 492 (get-buffer-window buffer))
yuuji@47 493 (progn
yuuji@47 494 (if select
yuuji@51 495 (goto-buffer-window buffer))
yuuji@47 496 t))
yuuji@23 497 (let ((window (selected-window))
yuuji@23 498 (wlist (YaTeX-window-list)) win w (x 0))
yuuji@23 499 (cond
yuuji@23 500 ((> (length wlist) 2)
yuuji@23 501 (if func
yuuji@23 502 (while wlist
yuuji@23 503 (setq w (car wlist))
yuuji@23 504 (if (and (not (eq window w))
yuuji@23 505 (> (funcall func w) x))
yuuji@23 506 (setq win w x (funcall func w)))
yuuji@23 507 (setq wlist (cdr wlist)))
yuuji@23 508 (setq win (get-lru-window)))
yuuji@23 509 (select-window win)
yuuji@23 510 (switch-to-buffer buffer)
yuuji@23 511 (or select (select-window window)))
yuuji@23 512 ((= (length wlist) 2)
yuuji@49 513 ;(other-window 1);This does not work properly on Emacs-19
yuuji@49 514 (select-window (get-lru-window))
yuuji@23 515 (switch-to-buffer buffer)
yuuji@23 516 (or select (select-window window)))
yuuji@23 517 (t ;if one-window
yuuji@23 518 (cond
yuuji@86 519 ((and YaTeX-emacs-19 window-system (get-buffer-window buffer t))
yuuji@47 520 nil) ;if found in other frame
yuuji@23 521 (YaTeX-default-pop-window-height
yuuji@51 522 (split-window-calculate-height YaTeX-default-pop-window-height)
yuuji@59 523 ;;(pop-to-buffer buffer) ;damn! emacs-19.30
yuuji@59 524 (select-window (next-window nil 1))
yuuji@59 525 (switch-to-buffer (get-buffer-create buffer))
yuuji@23 526 (or select (select-window window)))
yuuji@23 527 (t nil)))
yuuji@69 528 ))))
yuuji@69 529
yuuji@69 530 (cond
yuuji@69 531 ((fboundp 'screen-height)
yuuji@69 532 (fset 'YaTeX-screen-height 'screen-height)
yuuji@182 533 (fset 'YaTeX-screen-width 'screen-width)
yuuji@182 534 (fset 'YaTeX-set-screen-height 'set-screen-height)
yuuji@182 535 (fset 'YaTeX-set-screen-width 'set-screen-width))
yuuji@69 536 ((fboundp 'frame-height)
yuuji@69 537 (fset 'YaTeX-screen-height 'frame-height)
yuuji@182 538 (fset 'YaTeX-screen-width 'frame-width)
yuuji@182 539 (fset 'YaTeX-set-screen-height 'set-frame-height)
yuuji@182 540 (fset 'YaTeX-set-screen-width 'set-frame-width))
yuuji@182 541 (t (error "I don't know how to run YaTeX on this Emacs...")))
yuuji@23 542
yuuji@23 543 ;;;###autoload
yuuji@51 544 (defun split-window-calculate-height (height)
yuuji@51 545 "Split current window wight specified HEIGHT.
yuuji@59 546 If HEIGHT is number, make a new window that has HEIGHT lines.
yuuji@59 547 If HEIGHT is string, make a new window that occupies HEIGT % of screen height.
yuuji@51 548 Otherwise split window conventionally."
yuuji@59 549 (if (one-window-p t)
yuuji@51 550 (split-window
yuuji@51 551 (selected-window)
yuuji@51 552 (max
yuuji@51 553 (min
yuuji@69 554 (- (YaTeX-screen-height)
yuuji@59 555 (if (numberp height)
yuuji@59 556 (+ height 2)
yuuji@69 557 (/ (* (YaTeX-screen-height)
yuuji@59 558 (string-to-int height))
yuuji@51 559 100)))
yuuji@69 560 (- (YaTeX-screen-height) window-min-height 1))
yuuji@69 561 window-min-height))))
yuuji@51 562
yuuji@51 563 ;;;###autoload
yuuji@23 564 (defun YaTeX-window-list ()
yuuji@23 565 (let*((curw (selected-window)) (win curw) (wlist (list curw)))
yuuji@23 566 (while (not (eq curw (setq win (next-window win))))
yuuji@23 567 (or (eq win (minibuffer-window))
yuuji@23 568 (setq wlist (cons win wlist))))
yuuji@69 569 wlist))
yuuji@23 570
yuuji@72 571 (if YaTeX-emacs-21
yuuji@72 572 ;; Emacs-21's next-window returns other frame's window even if called
yuuji@72 573 ;; with argument ALL-FRAMES nil, when called from minibuffer context.
yuuji@72 574 ;; Therefore, check frame identity here.
yuuji@72 575 (defun YaTeX-window-list ()
yuuji@72 576 (let*((curw (selected-window)) (win curw) (wlist (list curw))
yuuji@72 577 (curf (window-frame curw)))
yuuji@72 578 (while (and (not (eq curw (setq win (next-window win))))
yuuji@72 579 (eq curf (window-frame win)))
yuuji@72 580 (or (eq win (minibuffer-window))
yuuji@72 581 (setq wlist (cons win wlist))))
yuuji@72 582 wlist)))
yuuji@72 583
yuuji@23 584 ;;;###autoload
yuuji@23 585 (defun substitute-all-key-definition (olddef newdef keymap)
yuuji@23 586 "Replace recursively OLDDEF with NEWDEF for any keys in KEYMAP now
yuuji@23 587 defined as OLDDEF. In other words, OLDDEF is replaced with NEWDEF
yuuji@23 588 where ever it appears."
yuuji@68 589 (if YaTeX-emacs-19
yuuji@68 590 (substitute-key-definition olddef newdef keymap global-map)
yuuji@68 591 (mapcar
yuuji@68 592 (function (lambda (key) (define-key keymap key newdef)))
yuuji@68 593 (where-is-internal olddef keymap))))
yuuji@23 594
yuuji@23 595 ;;;###autoload
yuuji@23 596 (defun YaTeX-match-string (n &optional m)
yuuji@23 597 "Return (buffer-substring (match-beginning n) (match-beginning m))."
yuuji@23 598 (if (match-beginning n)
yuuji@80 599 (YaTeX-buffer-substring (match-beginning n)
yuuji@69 600 (match-end (or m n)))))
yuuji@23 601
yuuji@23 602 ;;;###autoload
yuuji@23 603 (defun YaTeX-minibuffer-complete ()
yuuji@49 604 "Complete in minibuffer.
yuuji@51 605 If the symbol 'delim is bound and is string, its value is assumed to be
yuuji@49 606 the character class of delimiters. Completion will be performed on
yuuji@51 607 the last field separated by those delimiters.
yuuji@51 608 If the symbol 'quick is bound and is 't, when the try-completion results
yuuji@51 609 in t, exit minibuffer immediately."
yuuji@23 610 (interactive)
yuuji@72 611 (save-restriction
yuuji@72 612 (narrow-to-region
yuuji@72 613 (if (fboundp 'field-beginning) (field-beginning (point-max)) (point-min))
yuuji@72 614 (point-max))
yuuji@72 615 (let ((md (match-data)) beg word compl
yuuji@72 616 (quick (and (boundp 'quick) (eq quick t)))
yuuji@72 617 (displist ;function to display completion-list
yuuji@72 618 (function
yuuji@72 619 (lambda ()
yuuji@72 620 (with-output-to-temp-buffer "*Completions*"
yuuji@72 621 (display-completion-list
yuuji@72 622 (all-completions word minibuffer-completion-table)))))))
yuuji@72 623 (setq beg (if (and (boundp 'delim) (stringp delim))
yuuji@72 624 (save-excursion
yuuji@72 625 (skip-chars-backward (concat "^" delim))
yuuji@72 626 (point))
yuuji@72 627 (point-min))
yuuji@72 628 word (buffer-substring beg (point-max))
yuuji@72 629 compl (try-completion word minibuffer-completion-table))
yuuji@72 630 (cond
yuuji@72 631 ((eq compl t)
yuuji@72 632 (if quick (exit-minibuffer)
yuuji@72 633 (let ((p (point)) (max (point-max)))
yuuji@72 634 (unwind-protect
yuuji@72 635 (progn
yuuji@72 636 (goto-char max)
yuuji@72 637 (insert " [Sole completion]")
yuuji@72 638 (goto-char p)
yuuji@72 639 (sit-for 1))
yuuji@72 640 (delete-region max (point-max))
yuuji@72 641 (goto-char p)))))
yuuji@72 642 ((eq compl nil)
yuuji@72 643 (ding)
yuuji@72 644 (save-excursion
yuuji@72 645 (let (p)
yuuji@72 646 (unwind-protect
yuuji@72 647 (progn
yuuji@72 648 (goto-char (setq p (point-max)))
yuuji@72 649 (insert " [No match]")
yuuji@72 650 (goto-char p)
yuuji@72 651 (sit-for 2))
yuuji@72 652 (delete-region p (point-max))))))
yuuji@72 653 ((string= compl word)
yuuji@72 654 (funcall displist))
yuuji@72 655 (t (delete-region beg (point-max))
yuuji@72 656 (insert compl)
yuuji@72 657 (if quick
yuuji@72 658 (if (eq (try-completion compl minibuffer-completion-table) t)
yuuji@72 659 (exit-minibuffer)
yuuji@72 660 (funcall displist)))))
yuuji@72 661 (store-match-data md))))
yuuji@23 662
yuuji@51 663 (defun YaTeX-minibuffer-quick-complete ()
yuuji@51 664 "Set 'quick to 't and call YaTeX-minibuffer-complete.
yuuji@51 665 See documentation of YaTeX-minibuffer-complete."
yuuji@51 666 (interactive)
yuuji@51 667 (let ((quick t))
yuuji@51 668 (self-insert-command 1)
yuuji@51 669 (YaTeX-minibuffer-complete)))
yuuji@51 670
yuuji@168 671 (defun YaTeX-yatex-buffer-list ()
yuuji@168 672 (save-excursion
yuuji@168 673 (delq nil (mapcar (function (lambda (buf)
yuuji@168 674 (set-buffer buf)
yuuji@168 675 (if (eq major-mode 'yatex-mode) buf)))
yuuji@168 676 (buffer-list)))))
yuuji@168 677
yuuji@51 678 (defun foreach-buffers (pattern job)
yuuji@51 679 "For each buffer which matches with PATTERN, do JOB."
yuuji@51 680 (let ((list (buffer-list)))
yuuji@51 681 (save-excursion
yuuji@51 682 (while list
yuuji@51 683 (set-buffer (car list))
yuuji@51 684 (if (or (and (stringp pattern)
yuuji@51 685 (buffer-file-name)
yuuji@51 686 (string-match pattern (buffer-file-name)))
yuuji@51 687 (and (symbolp pattern) major-mode (eq major-mode pattern)))
yuuji@51 688 (eval job))
yuuji@69 689 (setq list (cdr list))))))
yuuji@51 690
yuuji@51 691 (defun goto-buffer-window (buffer)
yuuji@51 692 "Select window which is bound to BUFFER.
yuuji@51 693 If no such window exist, switch to buffer BUFFER."
yuuji@52 694 (interactive "BGoto buffer: ")
yuuji@51 695 (if (stringp buffer)
yuuji@51 696 (setq buffer (or (get-file-buffer buffer) (get-buffer buffer))))
yuuji@51 697 (if (get-buffer buffer)
yuuji@51 698 (cond
yuuji@51 699 ((get-buffer-window buffer)
yuuji@51 700 (select-window (get-buffer-window buffer)))
yuuji@51 701 ((and YaTeX-emacs-19 (get-buffer-window buffer t))
yuuji@51 702 (let*((win (get-buffer-window buffer t))
yuuji@51 703 (frame (window-frame win)))
yuuji@51 704 (select-frame frame)
yuuji@51 705 (raise-frame frame)
yuuji@51 706 (focus-frame frame)
yuuji@51 707 (select-window win)
yuuji@51 708 (set-mouse-position frame 0 0)
yuuji@51 709 (and (featurep 'windows) (fboundp 'win:adjust-window)
yuuji@51 710 (win:adjust-window))))
yuuji@54 711 ((and (featurep 'windows) (fboundp 'win:get-buffer-window)
yuuji@56 712 (let ((w (win:get-buffer-window buffer)))
yuuji@56 713 (and w (win:switch-window w))))
yuuji@54 714 (select-window (get-buffer-window buffer)))
yuuji@69 715 (t (switch-to-buffer buffer)))))
yuuji@51 716
yuuji@51 717 ;; Here starts the functions which support gmhist-vs-Emacs19 compatible
yuuji@51 718 ;; reading with history.
yuuji@51 719 ;;;###autoload
yuuji@51 720 (defun completing-read-with-history
yuuji@51 721 (prompt table &optional predicate must-match initial hsym)
yuuji@51 722 "Completing read with general history: gmhist, Emacs-19."
yuuji@51 723 (let ((minibuffer-history
yuuji@51 724 (or (symbol-value hsym)
yuuji@51 725 (and (boundp 'minibuffer-history) minibuffer-history)))
yuuji@51 726 (minibuffer-history-symbol (or hsym 'minibuffer-history)))
yuuji@51 727 (prog1
yuuji@51 728 (if (fboundp 'completing-read-with-history-in)
yuuji@51 729 (completing-read-with-history-in
yuuji@51 730 minibuffer-history-symbol prompt table predicate must-match initial)
yuuji@51 731 (completing-read prompt table predicate must-match initial))
yuuji@51 732 (if (and YaTeX-emacs-19 hsym) (set hsym minibuffer-history)))))
yuuji@51 733
yuuji@51 734 ;;;###autoload
yuuji@51 735 (defun read-from-minibuffer-with-history (prompt &optional init map read hsym)
yuuji@51 736 "Read from minibuffer with general history: gmhist, Emacs-19."
yuuji@51 737 (cond
yuuji@51 738 (YaTeX-emacs-19
yuuji@51 739 (read-from-minibuffer prompt init map read hsym))
yuuji@51 740 (t
yuuji@51 741 (let ((minibuffer-history-symbol hsym))
yuuji@51 742 (read-from-minibuffer prompt init map read)))))
yuuji@51 743
yuuji@51 744 ;;;###autoload
yuuji@51 745 (defun read-string-with-history (prompt &optional init hsym)
yuuji@51 746 "Read string with history: gmhist(Emacs-18) and Emacs-19."
yuuji@51 747 (cond
yuuji@51 748 (YaTeX-emacs-19
yuuji@51 749 (read-from-minibuffer prompt init minibuffer-local-map nil hsym))
yuuji@51 750 ((featurep 'gmhist-mh)
yuuji@51 751 (read-with-history-in hsym prompt init))
yuuji@51 752 (t (read-string prompt init))))
yuuji@23 753
yuuji@69 754 ;;;###autoload
yuuji@69 755 (fset 'YaTeX-rassoc
yuuji@69 756 (if (and nil (fboundp 'rassoc) (subrp (symbol-function 'rassoc)))
yuuji@69 757 (symbol-function 'rassoc)
yuuji@70 758 (function
yuuji@70 759 (lambda (key list)
yuuji@70 760 (let ((l list))
yuuji@70 761 (catch 'found
yuuji@70 762 (while l
yuuji@70 763 (if (equal key (cdr (car l)))
yuuji@70 764 (throw 'found (car l)))
yuuji@70 765 (setq l (cdr l)))))))))
yuuji@70 766
yuuji@70 767 (defun YaTeX-insert-file-contents (file visit &optional beg end)
yuuji@70 768 (cond
yuuji@72 769 ((and (string< "19" emacs-version) (not (featurep 'xemacs)))
yuuji@70 770 (insert-file-contents file visit beg end))
yuuji@77 771 ((string-match "unix\\|linux" (symbol-name system-type))
yuuji@70 772 (let ((default-process-coding-system
yuuji@72 773 (and (boundp '*noconv*) (list '*noconv*)))
yuuji@72 774 (file-coding-system (and (boundp '*noconv*) '*noconv*))
yuuji@70 775 kanji-fileio-code
yuuji@70 776 (default-process-kanji-code 0))
yuuji@70 777 (call-process shell-file-name file (current-buffer) nil
yuuji@70 778 (or (and (boundp 'shell-command-option)
yuuji@70 779 shell-command-option)
yuuji@70 780 "-c")
yuuji@77 781 (format "dd bs=1 count=%d | tail -c +%d" end beg))))
yuuji@70 782 (t (insert-file-contents file))))
yuuji@70 783
yuuji@70 784 (defun YaTeX-split-string (str &optional sep null)
yuuji@70 785 "Split string STR by every occurrence of SEP(regexp).
yuuji@70 786 If the optional second argument SEP is nil, it defaults to \"[ \f\t\n\r\v]+\".
yuuji@70 787 Do not include null string by default. Non-nil for optional third argument
yuuji@70 788 NULL includes null string in a list."
yuuji@70 789 (let ((sep (or sep "[ \f\t\n\r\v]+"))
yuuji@70 790 list m)
yuuji@70 791 (while str
yuuji@70 792 (if (setq m (string-match sep str))
yuuji@70 793 (progn
yuuji@70 794 (if (or (> m 0) null)
yuuji@70 795 (setq list (cons (substring str 0 m) list)))
yuuji@70 796 (setq str (substring str (match-end 0))))
yuuji@70 797 (if (or null (string< "" str))
yuuji@70 798 (setq list (cons str list)))
yuuji@70 799 (setq str nil)))
yuuji@70 800 (nreverse list)))
yuuji@69 801
yuuji@73 802 ;;;###autoload
yuuji@73 803 (defun YaTeX-delete1 (elt list)
yuuji@73 804 "Delete"
yuuji@73 805 (let (e)
yuuji@73 806 (while (setq e (YaTeX-member elt list))
yuuji@73 807 (setq list (delq (car e) list))))
yuuji@73 808 list)
yuuji@73 809 (if (fboundp 'delete)
yuuji@73 810 (fset 'YaTeX-delete (symbol-function 'delete))
yuuji@73 811 (fset 'YaTeX-delete (symbol-function 'YaTeX-delete1)))
yuuji@73 812
yuuji@73 813 (defun YaTeX-member1 (elt list)
yuuji@73 814 (catch 'found
yuuji@73 815 (while list
yuuji@73 816 (if (equal elt (car list))
yuuji@73 817 (throw 'found list))
yuuji@73 818 (setq list (cdr list)))))
yuuji@73 819
yuuji@73 820 (if (and (fboundp 'member) (subrp (symbol-function 'member)))
yuuji@73 821 (fset 'YaTeX-member (symbol-function 'member))
yuuji@73 822 (fset 'YaTeX-member (symbol-function 'YaTeX-member1)))
yuuji@73 823
yuuji@53 824 ;;;
yuuji@53 825 ;; Interface function for windows.el
yuuji@53 826 ;;;
yuuji@53 827 ;;;###autoload
yuuji@53 828 (defun YaTeX-switch-to-window ()
yuuji@53 829 "Switch to windows.el's window decided by last pressed key."
yuuji@53 830 (interactive)
yuuji@53 831 (or (featurep 'windows) (error "Why don't you use `windows.el'?"))
yuuji@53 832 (win-switch-to-window 1 (- last-command-char win:base-key)))
yuuji@53 833
yuuji@64 834 ;;;###autoload
yuuji@138 835 (defun YaTeX-command-to-string (cmd)
yuuji@138 836 (if (fboundp 'shell-command-to-string)
yuuji@138 837 (funcall 'shell-command-to-string cmd)
yuuji@138 838 (let ((tbuf " *tmpout*"))
yuuji@138 839 (if (get-buffer-create tbuf) (kill-buffer tbuf))
yuuji@138 840 (let ((standard-output (get-buffer-create tbuf)))
yuuji@138 841 (unwind-protect
yuuji@138 842 (save-excursion
yuuji@138 843 (call-process
yuuji@138 844 shell-file-name nil tbuf nil YaTeX-shell-command-option cmd)
yuuji@138 845 (set-buffer tbuf)
yuuji@138 846 (buffer-string))
yuuji@138 847 (kill-buffer tbuf))))))
yuuji@138 848
yuuji@138 849 ;;;###autoload
yuuji@64 850 (defun YaTeX-reindent (col)
yuuji@64 851 "Remove current indentation and reindento to COL column."
yuuji@64 852 (save-excursion
yuuji@64 853 (beginning-of-line)
yuuji@64 854 (skip-chars-forward " \t")
yuuji@64 855 (if (/= col (current-column))
yuuji@64 856 (progn
yuuji@64 857 (delete-region (point) (progn (beginning-of-line) (point)))
yuuji@64 858 (indent-to col))))
yuuji@64 859 (skip-chars-forward " \t" (point-end-of-line)))
yuuji@64 860
yuuji@64 861 (defun YaTeX-inner-environment (&optional quick)
yuuji@64 862 "Return current inner-most environment.
yuuji@64 863 Non-nil for optional argument QUICK restricts search bound to most
yuuji@64 864 recent sectioning command. Matching point is stored to property 'point
yuuji@64 865 of 'YaTeX-inner-environment, which can be referred by
yuuji@64 866 (get 'YaTeX-inner-environment 'point)."
yuuji@73 867 (put 'YaTeX-inner-environment 'point (point-min))
yuuji@73 868 (put 'YaTeX-inner-environment 'indent 0)
yuuji@64 869 (let*((nest 0)
yuuji@64 870 (beg (YaTeX-replace-format-args
yuuji@64 871 (regexp-quote YaTeX-struct-begin)
yuuji@64 872 ;YaTeX-struct-begin ;=== TENTATIVE!! ==
yuuji@64 873 YaTeX-struct-name-regexp
yuuji@64 874 (if (eq major-mode 'yahtml-mode) "\\s *.*" "")
yuuji@64 875 ""))
yuuji@64 876 (end (YaTeX-replace-format-args
yuuji@64 877 (regexp-quote YaTeX-struct-end)
yuuji@64 878 YaTeX-struct-name-regexp "" ""))
yuuji@64 879 (begend (concat "\\(" beg "\\)\\|\\(" end "\\)"))
yuuji@64 880 bound m0
yuuji@64 881 (htmlp (eq major-mode 'yahtml-mode))
yuuji@64 882 (open
yuuji@64 883 (concat "^" (or (cdr (assq major-mode '((yahtml-mode . "<")))) "{")))
yuuji@64 884 (close
yuuji@64 885 (concat "^"
yuuji@64 886 (or (cdr(assq major-mode '((yahtml-mode . "\n\t >")))) "}"))))
yuuji@64 887 (save-excursion
yuuji@64 888 (if quick
yuuji@64 889 (setq bound
yuuji@64 890 (save-excursion
yuuji@64 891 (if htmlp
yuuji@64 892 ;;(re-search-backward YaTeX-sectioning-regexp nil 1)
yuuji@73 893 ;;(goto-char (point-min)) ;Is this enough? 97/6/26
yuuji@73 894 (re-search-backward yahtml-indentation-boundary nil 1)
yuuji@64 895 (YaTeX-re-search-active-backward
yuuji@64 896 (concat YaTeX-ec-regexp
yuuji@64 897 "\\(" YaTeX-sectioning-regexp "\\)\\*?{")
yuuji@64 898 YaTeX-comment-prefix nil 1))
yuuji@64 899 (or (bobp) (end-of-line))
yuuji@64 900 (point))))
yuuji@64 901 (if (catch 'begin
yuuji@64 902 (if (and (numberp bound) (< (point) bound)) (throw 'begin nil))
yuuji@64 903 (while (YaTeX-re-search-active-backward
yuuji@64 904 begend YaTeX-comment-prefix bound t)
yuuji@64 905 (setq m0 (match-beginning 0))
yuuji@64 906 (if (looking-at end) ;;(match-beginning 2)
yuuji@64 907 (setq nest (1+ nest))
yuuji@64 908 (setq nest (1- nest)))
yuuji@64 909 (if (< nest 0)
yuuji@64 910 (progn
yuuji@64 911 (put 'YaTeX-inner-environment 'point m0)
yuuji@64 912 (goto-char m0)
yuuji@64 913 (put 'YaTeX-inner-environment 'indent (current-column))
yuuji@64 914 (throw 'begin t)))))
yuuji@187 915 (YaTeX-buffer-substring
yuuji@64 916 (progn (skip-chars-forward open) (1+ (point)))
yuuji@69 917 (progn (skip-chars-forward close) (point)))))))
yuuji@64 918
yuuji@73 919 (defun YaTeX-goto-corresponding-environment (&optional allow-mismatch noerr)
yuuji@73 920 "Go to corresponding begin/end enclosure.
yuuji@73 921 Optional argument ALLOW-MISMATCH allows mismatch open/clese. Use this
yuuji@73 922 for \left(, \right).
yuuji@73 923 Optional third argument NOERR causes no error for unballanced environment."
yuuji@73 924 (interactive)
yuuji@73 925 (if (not (YaTeX-on-begin-end-p)) nil
yuuji@73 926 (let ((p (match-end 0)) b0 b1 env (nest 0) regexp re-s (op (point))
yuuji@73 927 (m0 (match-beginning 0)) ;whole matching
yuuji@73 928 (m1 (match-beginning 1)) ;environment in \begin{}
yuuji@73 929 (m2 (match-beginning 2)) ;environment in \end{}
yuuji@73 930 (m3 (match-beginning 3))) ;environment in \[ \] \( \)
yuuji@73 931 ;(setq env (regexp-quote (buffer-substring p (match-beginning 0))))
yuuji@73 932 (if (cond
yuuji@73 933 (m1 ;if begin{xxx}
yuuji@73 934 (setq env
yuuji@73 935 (if allow-mismatch YaTeX-struct-name-regexp
yuuji@73 936 (regexp-quote (buffer-substring m1 (match-end 1)))))
yuuji@73 937 ; (setq regexp (concat "\\(\\\\end{" env "}\\)\\|"
yuuji@73 938 ; "\\(\\\\begin{" env "}\\)"))
yuuji@73 939 (setq regexp
yuuji@73 940 (concat
yuuji@73 941 "\\("
yuuji@73 942 (YaTeX-replace-format-args
yuuji@73 943 (regexp-quote YaTeX-struct-end) env "" "")
yuuji@73 944 "\\)\\|\\("
yuuji@73 945 (YaTeX-replace-format-args
yuuji@73 946 (regexp-quote YaTeX-struct-begin) env "" "")
yuuji@73 947 "\\)"))
yuuji@73 948 (setq re-s 're-search-forward))
yuuji@73 949 (m2 ;if end{xxx}
yuuji@73 950 (setq env
yuuji@73 951 (if allow-mismatch YaTeX-struct-name-regexp
yuuji@73 952 (regexp-quote (buffer-substring m2 (match-end 2)))))
yuuji@73 953 ; (setq regexp (concat "\\(\\\\begin{" env "}\\)\\|"
yuuji@73 954 ; "\\(\\\\end{" env "}\\)"))
yuuji@73 955 (setq regexp
yuuji@73 956 (concat
yuuji@73 957 "\\("
yuuji@73 958 (YaTeX-replace-format-args
yuuji@73 959 (regexp-quote YaTeX-struct-begin) env "" "")
yuuji@73 960 "\\)\\|\\("
yuuji@73 961 (YaTeX-replace-format-args
yuuji@73 962 (regexp-quote YaTeX-struct-end) env "" "")
yuuji@73 963 "\\)"))
yuuji@73 964 (setq re-s 're-search-backward))
yuuji@73 965 (m3 ;math environment
yuuji@73 966 (setq env (char-after (1+ m3))
yuuji@73 967 regexp (format "\\(%s%s\\)\\|\\(%s%s\\)"
yuuji@73 968 YaTeX-ec-regexp
yuuji@73 969 (regexp-quote
yuuji@73 970 (cdr (assq env '((?( . ")") (?) . "(")
yuuji@73 971 (?[ . "]") (?] . "[")))))
yuuji@73 972 YaTeX-ec-regexp
yuuji@73 973 (regexp-quote (char-to-string env)))
yuuji@73 974 re-s (if (memq env '(?\( ?\[))
yuuji@73 975 're-search-forward
yuuji@73 976 're-search-backward)))
yuuji@73 977 (t (if noerr nil (error "Corresponding environment not found."))))
yuuji@73 978 (progn
yuuji@73 979 (while (and (>= nest 0) (funcall re-s regexp nil t))
yuuji@73 980 (setq b0 (match-beginning 0) b1 (match-beginning 1))
yuuji@73 981 (if (or (equal b0 m0)
yuuji@73 982 (YaTeX-literal-p b0))
yuuji@73 983 nil
yuuji@73 984 (setq nest (if (equal b0 b1)
yuuji@73 985 (1- nest) (1+ nest)))))
yuuji@73 986 (if (< nest 0)
yuuji@73 987 (goto-char (match-beginning 0)) ;found.
yuuji@73 988 (goto-char op)
yuuji@73 989 (funcall
yuuji@73 990 (if noerr 'message 'error)
yuuji@73 991 "Corresponding environment `%s' not found." env)
yuuji@73 992 (sit-for 1)
yuuji@73 993 nil))))))
yuuji@73 994
yuuji@64 995 (defun YaTeX-end-environment ()
yuuji@64 996 "Close opening environment"
yuuji@64 997 (interactive)
yuuji@64 998 (let ((env (YaTeX-inner-environment)))
yuuji@64 999 (if (not env) (error "No premature environment")
yuuji@64 1000 (save-excursion
yuuji@187 1001 (if (and
yuuji@187 1002 (YaTeX-re-search-active-forward
yuuji@187 1003 (concat
yuuji@187 1004 "\\(" (YaTeX-replace-format-args
yuuji@187 1005 YaTeX-struct-end env "" "")
yuuji@187 1006 "\\)\\|\\(" (YaTeX-replace-format-args
yuuji@187 1007 YaTeX-struct-begin env "" "")
yuuji@187 1008 "\\)")
yuuji@187 1009 YaTeX-comment-prefix nil t)
yuuji@187 1010 (match-beginning 1)) ;is closing struc.
yuuji@64 1011 (if (y-or-n-p
yuuji@64 1012 (concat "Environment `" env
yuuji@64 1013 "' may be already closed. Force close?"))
yuuji@64 1014 nil
yuuji@64 1015 (error "end environment aborted."))))
yuuji@64 1016 (message "") ;Erase (y or n) message.
yuuji@64 1017 (YaTeX-insert-struc 'end env)
yuuji@64 1018 (save-excursion
yuuji@64 1019 (goto-char (or (get 'YaTeX-inner-environment 'point) (match-end 0)))
yuuji@64 1020 (if (pos-visible-in-window-p)
yuuji@64 1021 (sit-for (if YaTeX-dos 2 1))
yuuji@64 1022 (message "Matches with %s at line %d"
yuuji@64 1023 (YaTeX-replace-format-args YaTeX-struct-begin env "" "")
yuuji@69 1024 (count-lines (point-min) (point))))))))
yuuji@64 1025
yuuji@70 1026 (defun YaTeX-beginning-of-environment (&optional limit-search-bound end)
yuuji@70 1027 "Goto the beginning of the current environment.
yuuji@70 1028 Optional argument LIMIT-SEARCH-BOUND non-nil limits the search bound to
yuuji@70 1029 most recent sectioning command. Non-nil for optional third argument END
yuuji@70 1030 goes to end of environment."
yuuji@70 1031 (interactive)
yuuji@70 1032 (let ((op (point)))
yuuji@70 1033 (if (YaTeX-inner-environment limit-search-bound)
yuuji@70 1034 (progn
yuuji@70 1035 (goto-char (get 'YaTeX-inner-environment 'point))
yuuji@70 1036 (and end (YaTeX-goto-corresponding-environment))
yuuji@70 1037 (if (interactive-p) (push-mark op))
yuuji@80 1038 (point)))))
yuuji@70 1039
yuuji@70 1040 (defun YaTeX-end-of-environment (&optional limit-search-bound)
yuuji@70 1041 "Goto the end of the current environment.
yuuji@70 1042 Optional argument LIMIT-SEARCH-BOUND non-nil limits the search bound
yuuji@70 1043 to most recent sectioning command."
yuuji@70 1044 (interactive)
yuuji@70 1045 (YaTeX-beginning-of-environment limit-search-bound t))
yuuji@70 1046
yuuji@70 1047 (defun YaTeX-mark-environment ()
yuuji@70 1048 "Mark current position and move point to end of environment."
yuuji@70 1049 (interactive)
yuuji@130 1050 (require 'yatexmth)
yuuji@70 1051 (let ((curp (point)))
yuuji@130 1052 (if (YaTeX-in-math-mode-p)
yuuji@130 1053 (YaTeX-mark-mathenv)
yuuji@130 1054 (if (and (YaTeX-on-begin-end-p) (match-beginning 1)) ;if on \\begin
yuuji@130 1055 (progn (goto-char (match-end 0)))
yuuji@130 1056 (if (= (char-after (point)) ?\\) nil ;if on \\end
yuuji@130 1057 (skip-chars-backward "^\n\\\\")
yuuji@130 1058 (or (bolp) (forward-char -1))))
yuuji@130 1059 (if (not (YaTeX-end-of-environment)) ;arg1 turns to match-beginning 1
yuuji@70 1060 (progn
yuuji@130 1061 (goto-char curp)
yuuji@130 1062 (error "Cannot found the end of current environment."))
yuuji@130 1063 (YaTeX-goto-corresponding-environment)
yuuji@130 1064 (beginning-of-line) ;for confirmation
yuuji@130 1065 (if (< curp (point))
yuuji@130 1066 (progn
yuuji@130 1067 (message "Mark this environment?(y or n): ")
yuuji@130 1068 (if (= (read-char) ?y) nil
yuuji@130 1069 (goto-char curp)
yuuji@130 1070 (error "Abort. Please call again at more proper position."))))
yuuji@130 1071 (set-mark-command nil)
yuuji@130 1072 (YaTeX-goto-corresponding-environment)
yuuji@130 1073 (end-of-line)
yuuji@130 1074 (if (eobp) nil (forward-char 1))))))
yuuji@70 1075
yuuji@72 1076 (defun YaTeX-kill-buffer (buffer)
yuuji@72 1077 "Make effort to show parent buffer after kill."
yuuji@72 1078 (interactive "bKill buffer: ")
yuuji@72 1079 (or (get-buffer buffer)
yuuji@72 1080 (error "No such buffer %s" buffer))
yuuji@72 1081 (let ((pf YaTeX-parent-file))
yuuji@72 1082 (kill-buffer buffer)
yuuji@72 1083 (and pf
yuuji@72 1084 (get-file-buffer pf)
yuuji@72 1085 (switch-to-buffer (get-file-buffer pf)))))
yuuji@70 1086
yuuji@142 1087 (defun YaTeX-get-builtin (key)
yuuji@142 1088 "Read source built-in command of %# usage."
yuuji@142 1089 (catch 'builtin
yuuji@142 1090 (let ((bl (delq nil (list (current-buffer)
yuuji@142 1091 (and YaTeX-parent-file
yuuji@142 1092 (get-file-buffer YaTeX-parent-file)))))
yuuji@142 1093 (leader (or (cdr-safe (assq major-mode
yuuji@142 1094 '((yatex-mode . "%#")
yuuji@142 1095 (yahtml-mode . "<!-- #"))))
yuuji@142 1096 "")))
yuuji@142 1097 (save-excursion
yuuji@142 1098 (while bl
yuuji@142 1099 (set-buffer (car bl))
yuuji@142 1100 (save-excursion
yuuji@142 1101 (goto-char (point-min))
yuuji@142 1102 (if (and (re-search-forward
yuuji@142 1103 (concat "^" (regexp-quote (concat leader key))) nil t)
yuuji@142 1104 (not (eolp)))
yuuji@142 1105 (throw 'builtin
yuuji@142 1106 (YaTeX-buffer-substring
yuuji@142 1107 (progn
yuuji@142 1108 (skip-chars-forward " \t" (point-end-of-line))
yuuji@142 1109 (point))
yuuji@142 1110 (if (string< "" comment-end)
yuuji@142 1111 (progn
yuuji@142 1112 (search-forward
yuuji@142 1113 comment-end (point-end-of-line) t)
yuuji@142 1114 (match-beginning 0))
yuuji@142 1115 (point-end-of-line))))))
yuuji@142 1116 (setq bl (cdr bl)))))))
yuuji@142 1117
yuuji@64 1118 ;;;VER2
yuuji@64 1119 (defun YaTeX-insert-struc (what env)
yuuji@64 1120 (cond
yuuji@64 1121 ((eq what 'begin)
yuuji@64 1122 (insert (YaTeX-replace-format-args
yuuji@64 1123 YaTeX-struct-begin env (YaTeX-addin env))))
yuuji@64 1124 ((eq what 'end)
yuuji@64 1125 (insert (YaTeX-replace-format-args YaTeX-struct-end env)))
yuuji@69 1126 (t nil)))
yuuji@64 1127
yuuji@80 1128 (defun YaTeX-string-width (str)
yuuji@80 1129 "Return the display width of string."
yuuji@80 1130 (if (fboundp 'string-width)
yuuji@80 1131 (string-width str)
yuuji@80 1132 (length str)))
yuuji@80 1133 (defun YaTeX-truncate-string-width (str width)
yuuji@80 1134 (cond
yuuji@80 1135 ((fboundp 'truncate-string-to-width) (truncate-string-to-width str width))
yuuji@80 1136 ((fboundp 'truncate-string) (truncate-string str width))
yuuji@80 1137 (t (substring str 0 width))))
yuuji@80 1138
yuuji@142 1139 (defun YaTeX-hex (str)
yuuji@142 1140 "Return int expressed by hexadecimal string STR."
yuuji@142 1141 (if (string< "20" emacs-version)
yuuji@142 1142 (string-to-number str 16)
yuuji@142 1143 (let ((md (match-data)))
yuuji@142 1144 (unwind-protect
yuuji@142 1145 (if (string-match "[^0-9a-f]" str)
yuuji@142 1146 (error "Non hexadecimal character in %s" str)
yuuji@142 1147 (let ((i 0) d)
yuuji@142 1148 (setq str (downcase str))
yuuji@142 1149 (while (string< "" str)
yuuji@142 1150 (setq d (+ 0 (string-to-char str)) ; + 0 for XEmacs
yuuji@142 1151 i (+ (* 16 i) (- d (if (<= d ?9) ?0 (- ?a 10))))
yuuji@142 1152 str (substring str 1)))
yuuji@142 1153 i))
yuuji@142 1154 (store-match-data md)))))
yuuji@142 1155
yuuji@142 1156
yuuji@64 1157 ;;; Function for menu support
yuuji@64 1158 (defun YaTeX-define-menu (keymap bindlist)
yuuji@64 1159 "Define KEYMAP(symbol)'s menu-bindings according to BINDLIST.
yuuji@64 1160 KEYMAP should be a quoted symbol of newly allocated keymap.
yuuji@64 1161 BINDLIST consists of binding list. Each element is as follows.
yuuji@64 1162
yuuji@64 1163 '(menusymbol DOC_String . contents)
yuuji@64 1164
yuuji@64 1165 CONTENTS is one of lambda-form, interactive function, or other keymap.
yuuji@64 1166 See yatex19.el for example."
yuuji@64 1167 (cond
yuuji@64 1168 ((featurep 'xemacs)
yuuji@64 1169 (let (name)
yuuji@64 1170 (if (keymapp (symbol-value keymap))
yuuji@64 1171 (progn
yuuji@64 1172 (setq name (keymap-name (symbol-value keymap)))
yuuji@64 1173 (set keymap nil))
yuuji@64 1174 (setq name (car (symbol-value keymap)))
yuuji@64 1175 (set keymap (cdr (symbol-value keymap))))
yuuji@64 1176 (mapcar
yuuji@64 1177 (function
yuuji@64 1178 (lambda (bind)
yuuji@64 1179 (setq bind (cdr bind))
yuuji@64 1180 (if (eq (car-safe (cdr bind)) 'lambda)
yuuji@64 1181 (setcar (cdr bind) 'progn))
yuuji@64 1182 (if (stringp (car-safe (cdr bind)))
yuuji@64 1183 (set keymap
yuuji@64 1184 (cons (cdr bind) (symbol-value keymap)))
yuuji@64 1185 (set keymap
yuuji@64 1186 (cons (vector (car bind) (cdr bind) t)
yuuji@64 1187 (symbol-value keymap))))))
yuuji@64 1188 bindlist)
yuuji@64 1189 (set keymap (cons name (symbol-value keymap)))))
yuuji@64 1190 (t
yuuji@64 1191 (mapcar
yuuji@64 1192 (function
yuuji@64 1193 (lambda (bind)
yuuji@64 1194 (define-key (symbol-value keymap) (vector (car bind)) (cdr bind))))
yuuji@64 1195 bindlist))))
yuuji@64 1196
yuuji@72 1197 ;;;
yuuji@72 1198 ;; Emacs 21 compensational wrapper
yuuji@72 1199 ;;;
yuuji@72 1200 (defun YaTeX-minibuffer-begin ()
yuuji@72 1201 (if (fboundp 'field-beginning)
yuuji@72 1202 (field-beginning (point-max))
yuuji@72 1203 (point-min)))
yuuji@72 1204
yuuji@72 1205 (defun YaTeX-minibuffer-end ()
yuuji@72 1206 (if (fboundp 'field-end)
yuuji@72 1207 (field-end (point-max))
yuuji@72 1208 (point-max)))
yuuji@72 1209
yuuji@72 1210 (defun YaTeX-minibuffer-string ()
yuuji@72 1211 (buffer-substring (YaTeX-minibuffer-begin) (YaTeX-minibuffer-end)))
yuuji@72 1212
yuuji@72 1213 (defun YaTeX-minibuffer-erase ()
yuuji@72 1214 (if (eq (selected-window) (minibuffer-window))
yuuji@72 1215 (if (fboundp 'delete-field) (delete-field) (erase-buffer))))
yuuji@72 1216
yuuji@80 1217 (fset 'YaTeX-buffer-substring
yuuji@80 1218 (if (fboundp 'buffer-substring-no-properties)
yuuji@80 1219 'buffer-substring-no-properties
yuuji@80 1220 'buffer-substring))
yuuji@80 1221
yuuji@72 1222 ;;;
yuuji@72 1223 ;; hilit19 vs. font-lock
yuuji@72 1224 ;;;
yuuji@80 1225 (defvar YaTeX-19-functions-font-lock-direct
yuuji@80 1226 '(YaTeX-19-re-search-in-env))
yuuji@80 1227
yuuji@72 1228 (defun YaTeX-convert-pattern-hilit2fontlock (h19pa)
yuuji@72 1229 "Convert hilit19's H19PA patterns alist to font-lock's one.
yuuji@72 1230 This function is a makeshift for YaTeX and yahtml."
yuuji@72 1231 (let ((ignorecase (not (null (car h19pa))))
yuuji@72 1232 (palist (cdr h19pa))
yuuji@72 1233 flpa i newface
yuuji@72 1234 (mapping
yuuji@72 1235 '((bold . YaTeX-font-lock-bold-face)
yuuji@72 1236 (italic . YaTeX-font-lock-italic-face)
yuuji@73 1237 (defun . font-lock-function-name-face)
yuuji@73 1238 (define . font-lock-variable-name-face)
yuuji@72 1239 (keyword . font-lock-keyword-face)
yuuji@72 1240 (decl . YaTeX-font-lock-declaration-face)
yuuji@72 1241 (label . YaTeX-font-lock-label-face)
yuuji@72 1242 (crossref . YaTeX-font-lock-crossref-face)
yuuji@72 1243 (include . YaTeX-font-lock-include-face)
yuuji@72 1244 (formula . YaTeX-font-lock-formula-face)
yuuji@80 1245 (delimiter . YaTeX-font-lock-delimiter-face)
yuuji@72 1246 (string . ignore) (comment . ignore)
yuuji@72 1247 )))
yuuji@72 1248 (while (setq i (car palist))
yuuji@72 1249 (setq newface (nth 2 i)
yuuji@72 1250 newface (or (cdr (assq newface mapping)) newface))
yuuji@72 1251 (cond
yuuji@72 1252 ((eq newface 'ignore) nil) ;no translation
yuuji@72 1253 ((stringp (car i)) ;hiliting by regexp
yuuji@72 1254 (setq flpa
yuuji@72 1255 (cons
yuuji@72 1256 (if (numberp (car (cdr i)))
yuuji@72 1257 (list (car i) ;regexp
yuuji@72 1258 (car (cdr i)) ;matching group number
yuuji@73 1259 newface nil) ;'keep) ;keep is hilit19 taste
yuuji@72 1260 (list
yuuji@72 1261 (concat
yuuji@72 1262 (car i) ;original regexp and..
yuuji@72 1263 ;;"[^"
yuuji@72 1264 ;;(regexp-quote (substring (car (cdr i)) 0 1))
yuuji@72 1265 ;;"]+" ;for shortest match
yuuji@72 1266 ".*"
yuuji@72 1267 (car (cdr i)))
yuuji@73 1268 0 (list 'quote newface) nil)) ;;'keep))
yuuji@72 1269 flpa)))
yuuji@72 1270 ((and (symbolp (car i)) (fboundp (car i)))
yuuji@80 1271 (if (memq (car i) YaTeX-19-functions-font-lock-direct)
yuuji@80 1272 ;; Put direct function call for it.
yuuji@80 1273 ;; When calling this function, fontify entire matched string.
yuuji@80 1274 (setq flpa
yuuji@80 1275 (cons
yuuji@80 1276 (list
yuuji@80 1277 (list 'lambda (list 'dummy) ;dummy should be boundary
yuuji@80 1278 (list (car i) (list 'quote (car (cdr i)))))
yuuji@80 1279 (list 0 newface))
yuuji@80 1280 flpa))
yuuji@80 1281 (setq flpa
yuuji@80 1282 (cons
yuuji@80 1283 (list (car (cdr i)) ;regexp
yuuji@72 1284 (list
yuuji@72 1285 (list
yuuji@80 1286 'lambda (list 'dummy)
yuuji@80 1287 '(goto-char (match-beginning 0))
yuuji@80 1288 (if (eq (nth 3 i) 'overwrite)
yuuji@80 1289 nil
yuuji@80 1290 '(remove-text-properties
yuuji@80 1291 (point) (min (point-max) (1+ (point)))
yuuji@80 1292 '(face nil font-lock-multiline nil)))
yuuji@72 1293 (list
yuuji@80 1294 'let (list '(e (match-end 0))
yuuji@80 1295 (list 'm (list (car i) (car (cdr i)))))
yuuji@80 1296 (list
yuuji@80 1297 'if 'm
yuuji@80 1298 (list
yuuji@80 1299 'YaTeX-font-lock-fillin
yuuji@80 1300 (list 'car 'm)
yuuji@80 1301 (list 'cdr 'm)
yuuji@80 1302 (list 'quote 'face)
yuuji@80 1303 (list 'quote 'font-lock)
yuuji@80 1304 (list 'quote newface))
yuuji@80 1305 '(goto-char e)
yuuji@80 1306 ))
yuuji@80 1307 nil) ;retun nil to cheat font-lock
yuuji@80 1308 nil nil)) ;pre-match, post-match both nil
yuuji@80 1309 flpa)))))
yuuji@72 1310 (setq palist (cdr palist)));while
yuuji@72 1311 (if (featurep 'xemacsp)
yuuji@72 1312 (nreverse flpa)
yuuji@72 1313 flpa)))
yuuji@72 1314
yuuji@73 1315 (if (and (boundp 'YaTeX-use-font-lock)
yuuji@73 1316 YaTeX-use-font-lock)
yuuji@73 1317 (require 'font-lock))
yuuji@73 1318
yuuji@72 1319 (cond
yuuji@73 1320 ((and (featurep 'font-lock) (fboundp 'defface))
yuuji@72 1321 ;; In each defface, '(class static-color) is for Emacs-21 -nw
yuuji@72 1322 ;; '(class tty) is for XEmacs-21 -nw
yuuji@72 1323 (defface YaTeX-font-lock-label-face
yuuji@72 1324 '((((class static-color)) (:foreground "yellow" :underline t))
yuuji@72 1325 (((type tty)) (:foreground "yellow" :underline t))
yuuji@72 1326 (((class color) (background dark)) (:foreground "pink" :underline t))
yuuji@72 1327 (((class color) (background light)) (:foreground "red" :underline t))
yuuji@72 1328 (t (:bold t :underline t)))
yuuji@72 1329 "Font Lock mode face used to highlight labels."
yuuji@72 1330 :group 'font-lock-faces)
yuuji@72 1331 (defvar YaTeX-font-lock-label-face 'YaTeX-font-lock-label-face)
yuuji@72 1332
yuuji@72 1333 (defface YaTeX-font-lock-declaration-face
yuuji@72 1334 '((((class color) (background dark)) (:foreground "cyan"))
yuuji@72 1335 (((class color) (background light)) (:foreground "RoyalBlue"))
yuuji@72 1336 (t (:bold t :underline t)))
yuuji@72 1337 "Font Lock mode face used to highlight some declarations."
yuuji@72 1338 :group 'font-lock-faces)
yuuji@72 1339 (defvar YaTeX-font-lock-declaration-face 'YaTeX-font-lock-declaration-face)
yuuji@72 1340
yuuji@72 1341 (defface YaTeX-font-lock-include-face
yuuji@72 1342 '((((class color) (background dark)) (:foreground "Plum1"))
yuuji@72 1343 (((class color) (background light)) (:foreground "purple"))
yuuji@72 1344 (t (:bold t :underline t)))
yuuji@72 1345 "Font Lock mode face used to highlight expression for including."
yuuji@72 1346 :group 'font-lock-faces)
yuuji@72 1347 (defvar YaTeX-font-lock-include-face 'YaTeX-font-lock-include-face)
yuuji@72 1348
yuuji@72 1349 (defface YaTeX-font-lock-formula-face
yuuji@72 1350 '((((class static-color)) (:bold t))
yuuji@72 1351 (((type tty)) (:bold t))
yuuji@72 1352 (((class color) (background dark)) (:foreground "khaki" :bold t))
yuuji@72 1353 (((class color) (background light)) (:foreground "Goldenrod"))
yuuji@72 1354 (t (:bold t :underline t)))
yuuji@72 1355 "Font Lock mode face used to highlight formula."
yuuji@72 1356 :group 'font-lock-faces)
yuuji@72 1357 (defvar YaTeX-font-lock-formula-face 'YaTeX-font-lock-formula-face)
yuuji@72 1358
yuuji@80 1359 (defface YaTeX-font-lock-delimiter-face
yuuji@80 1360 '((((class static-color)) (:bold t))
yuuji@80 1361 (((type tty)) (:bold t))
yuuji@80 1362 (((class color) (background dark))
yuuji@80 1363 (:foreground "saddlebrown" :background "ivory" :bold t))
yuuji@80 1364 (((class color) (background light)) (:foreground "red"))
yuuji@80 1365 (t (:bold t :underline t)))
yuuji@80 1366 "Font Lock mode face used to highlight delimiters."
yuuji@80 1367 :group 'font-lock-faces)
yuuji@80 1368 (defvar YaTeX-font-lock-delimiter-face 'YaTeX-font-lock-delimiter-face)
yuuji@80 1369
yuuji@80 1370 (defface YaTeX-font-lock-math-sub-face
yuuji@80 1371 '((((class static-color)) (:bold t))
yuuji@80 1372 (((type tty)) (:bold t))
yuuji@80 1373 (((class color) (background dark))
yuuji@80 1374 (:foreground "khaki" :bold t :underline t))
yuuji@80 1375 (((class color) (background light))
yuuji@80 1376 (:foreground "Goldenrod" :underline t))
yuuji@80 1377 (t (:bold t :underline t)))
yuuji@80 1378 "Font Lock mode face used to highlight subscripts in formula."
yuuji@80 1379 :group 'font-lock-faces)
yuuji@80 1380 (defvar YaTeX-font-lock-math-sub-face 'YaTeX-font-lock-math-sub-face)
yuuji@80 1381
yuuji@80 1382 (defface YaTeX-font-lock-math-sup-face
yuuji@80 1383 '((((class static-color)) (:bold t))
yuuji@80 1384 (((type tty)) (:bold t))
yuuji@80 1385 (((class color) (background dark))
yuuji@80 1386 (:bold nil :foreground "ivory" :background "lightyellow4"))
yuuji@80 1387 (((class color) (background light))
yuuji@80 1388 (:underline t :foreground "gold"))
yuuji@80 1389 (t (:bold t :underline t)))
yuuji@80 1390 "Font Lock mode face used to highlight superscripts in formula."
yuuji@80 1391 :group 'font-lock-faces)
yuuji@80 1392 (defvar YaTeX-font-lock-math-sup-face 'YaTeX-font-lock-math-sup-face)
yuuji@80 1393
yuuji@72 1394 (defface YaTeX-font-lock-crossref-face
yuuji@72 1395 '((((class color) (background dark)) (:foreground "lightgoldenrod"))
yuuji@72 1396 (((class color) (background light)) (:foreground "DarkGoldenrod"))
yuuji@72 1397 (t (:bold t :underline t)))
yuuji@80 1398 "Font Lock mode face used to highlight cross references."
yuuji@72 1399 :group 'font-lock-faces)
yuuji@72 1400 (defvar YaTeX-font-lock-crossref-face 'YaTeX-font-lock-crossref-face)
yuuji@72 1401
yuuji@72 1402 (defface YaTeX-font-lock-bold-face
yuuji@72 1403 '((t (:bold t)))
yuuji@72 1404 "Font Lock mode face used to express bold itself."
yuuji@72 1405 :group 'font-lock-faces)
yuuji@72 1406 (defvar YaTeX-font-lock-bold-face 'YaTeX-font-lock-bold-face)
yuuji@72 1407
yuuji@72 1408 (defface YaTeX-font-lock-italic-face
yuuji@72 1409 '((t (:italic t)))
yuuji@72 1410 "Font Lock mode face used to express italic itself."
yuuji@72 1411 :group 'font-lock-faces)
yuuji@72 1412 (defvar YaTeX-font-lock-italic-face 'YaTeX-font-lock-italic-face)
yuuji@72 1413
yuuji@72 1414 ;; Make sure the 'YaTeX-font-lock-{italic,bold}-face is bound with
yuuji@72 1415 ;; italic/bold fontsets
yuuji@72 1416 (if (and (fboundp 'fontset-list) YaTeX-use-italic-bold)
yuuji@73 1417 (let ((flist (fontset-list)) fnt italic bold
yuuji@73 1418 (df (or (and (fboundp 'face-font-name) (face-font-name 'default))
yuuji@73 1419 (face-font 'default)
yuuji@73 1420 (face-font 'italic)
yuuji@73 1421 (face-font 'bold)
yuuji@73 1422 "giveup!"))
yuuji@73 1423 sz medium-i bold-r)
yuuji@73 1424 (string-match
yuuji@73 1425 "^-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-\\(\\([0-9]+\\)\\)" df)
yuuji@73 1426 (setq sz (or (match-string 1 df) "16"))
yuuji@73 1427 (setq medium-i (format "-medium-i-[^-]+--%s" sz)
yuuji@73 1428 bold-r (format "-bold-r-[^-]+--%s" sz))
yuuji@72 1429 (while flist
yuuji@72 1430 (setq fnt (car flist))
yuuji@72 1431 (condition-case err
yuuji@72 1432 (cond
yuuji@73 1433 ((and (string-match medium-i fnt)
yuuji@73 1434 (null italic))
yuuji@72 1435 (set-face-font 'YaTeX-font-lock-italic-face (setq italic fnt)))
yuuji@73 1436 ((and (string-match bold-r fnt) (null bold))
yuuji@72 1437 (set-face-font 'YaTeX-font-lock-bold-face (setq bold fnt))))
yuuji@72 1438 (error nil))
yuuji@72 1439 (setq flist (cdr flist)))))
yuuji@72 1440
yuuji@72 1441 ;;Borrowed from XEmacs's font-lock.el
yuuji@72 1442 (defsubst YaTeX-font-lock-fillin (start end setprop markprop value &optional object)
yuuji@72 1443 "Fill in one property of the text from START to END.
yuuji@72 1444 Arguments PROP and VALUE specify the property and value to put where none are
yuuji@72 1445 already in place. Therefore existing property values are not overwritten.
yuuji@72 1446 Optional argument OBJECT is the string or buffer containing the text."
yuuji@72 1447 (let ((start (text-property-any start end markprop nil object)) next
yuuji@72 1448 (putfunc (if (fboundp 'put-nonduplicable-text-property)
yuuji@72 1449 'put-nonduplicable-text-property
yuuji@72 1450 'put-text-property)))
yuuji@72 1451 (if (eq putfunc 'put-text-property)
yuuji@72 1452 (setq markprop setprop))
yuuji@72 1453 (while start
yuuji@72 1454 (setq next (next-single-property-change start markprop object end))
yuuji@72 1455 (funcall putfunc start next setprop value object)
yuuji@72 1456 (funcall putfunc start next markprop value object)
yuuji@72 1457 (setq start (text-property-any next end markprop nil object)))))
yuuji@72 1458
yuuji@72 1459 (defun YaTeX-warning-font-lock (mode)
yuuji@72 1460 (let ((sw (selected-window)))
yuuji@72 1461 ;;(pop-to-buffer (format " *%s warning*" mode))
yuuji@72 1462 ;;(erase-buffer)
yuuji@72 1463 (momentary-string-display
yuuji@72 1464 (cond
yuuji@72 1465 (YaTeX-japan
yuuji@72 1466 (concat mode " は、既に font-lock に対応しました。\n"
yuuji@72 1467 "~/.emacs などにある\n"
yuuji@72 1468 "\t(put 'yatex-mode 'font-lock-keywords 'tex-mode)\n"
yuuji@72 1469 "\t(put 'yahtml-mode 'font-lock-keywords 'html-mode)\n"
yuuji@72 1470 "などの間に合わせの記述はもはや不要です。"))
yuuji@72 1471 (t
yuuji@72 1472 (concat mode " now supports the font-lock by itself.\n"
yuuji@72 1473 "So you can remove the descriptions such as\n"
yuuji@72 1474 "\t(put 'yatex-mode 'font-lock-keywords 'tex-mode)\n"
yuuji@72 1475 "\t(put 'yahtml-mode 'font-lock-keywords 'html-mode)\n"
yuuji@72 1476 "in your ~/.emacs file. Thank you."))) (point))
yuuji@72 1477 (select-window sw)))
yuuji@72 1478 ))
yuuji@72 1479
yuuji@80 1480 (defun YaTeX-assoc-regexp (elt alist)
yuuji@80 1481 "Like assoc, return a list of whose car match with ELT. Search from ALIST.
yuuji@80 1482 Note that each car of cons-cell is regexp. ELT is a plain text to be
yuuji@80 1483 compared by regexp."
yuuji@80 1484 (let (x)
yuuji@80 1485 (catch 'found
yuuji@80 1486 (while alist
yuuji@80 1487 (setq x (car (car alist)))
yuuji@80 1488 (if (string-match x elt)
yuuji@80 1489 (throw 'found (car alist)))
yuuji@80 1490 (setq alist (cdr alist))))))
yuuji@64 1491
yuuji@68 1492 ;;;
yuuji@68 1493 ;; Functions for the Installation time
yuuji@68 1494 ;;;
yuuji@64 1495
yuuji@58 1496 (defun bcf-and-exit ()
yuuji@58 1497 "Byte compile rest of argument and kill-emacs."
yuuji@58 1498 (if command-line-args-left
yuuji@68 1499 (let ((load-path (cons "." load-path)))
yuuji@68 1500 (and (fboundp 'set-language-environment)
yuuji@68 1501 (featurep 'mule)
yuuji@68 1502 (set-language-environment "Japanese"))
yuuji@58 1503 (mapcar 'byte-compile-file command-line-args-left)
yuuji@58 1504 (kill-emacs))))
yuuji@64 1505
yuuji@80 1506 (defun tfb-and-exit ()
yuuji@80 1507 "Texinfo-format-buffer and kill-emacs."
yuuji@80 1508 (if command-line-args-left
yuuji@80 1509 (let ((load-path (cons ".." load-path)))
yuuji@80 1510 (and (fboundp 'set-language-environment)
yuuji@80 1511 (featurep 'mule)
yuuji@80 1512 (set-language-environment "Japanese"))
yuuji@80 1513 (mapcar (function
yuuji@80 1514 (lambda (arg)
yuuji@80 1515 (find-file arg)
yuuji@80 1516 (texinfo-format-buffer)
yuuji@80 1517 (basic-save-buffer)))
yuuji@80 1518 command-line-args-left)
yuuji@80 1519 (kill-emacs))))
yuuji@80 1520
yuuji@23 1521 (provide 'yatexlib)
yuuji@72 1522 ; Local variables:
yuuji@72 1523 ; fill-prefix: ";;; "
yuuji@72 1524 ; paragraph-start: "^$\\| \\|;;;$"
yuuji@72 1525 ; paragraph-separate: "^$\\| \\|;;;$"
yuuji@80 1526 ; coding: sjis
yuuji@72 1527 ; End: