yatex

annotate yatexlib.el @ 611:e87c3271b8fd

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