yatex

annotate yatexlib.el @ 72:0aaebd07dad0

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