yatex

view yatexlib.el @ 84:73cba5ddd111

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