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@64
|
4 ;;; (c )1994-1997 by HIROSE Yuuji.[yuuji@ae.keio.ac.jp]
|
yuuji@68
|
5 ;;; Last modified Mon Oct 19 13:41:29 1998 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@64
|
12 (defvar YaTeX-user-completion-table
|
yuuji@64
|
13 (if YaTeX-dos "~/_yatexrc" "~/.yatexrc")
|
yuuji@64
|
14 "*Default filename in which user completion table is saved.")
|
yuuji@64
|
15
|
yuuji@64
|
16 (defvar YaTeX-japan (or (boundp 'NEMACS) (boundp 'MULE) YaTeX-emacs-20)
|
yuuji@64
|
17 "Whether yatex mode is running on Japanese environment or not.")
|
yuuji@64
|
18
|
yuuji@64
|
19 (defvar YaTeX-kanji-code-alist
|
yuuji@64
|
20 (cond
|
yuuji@64
|
21 ((boundp '*junet*)
|
yuuji@64
|
22 (list (cons
|
yuuji@64
|
23 1
|
yuuji@64
|
24 (if YaTeX-dos (if (boundp '*sjis-dos*) *sjis-dos* *sjis*dos)
|
yuuji@64
|
25 *sjis*))
|
yuuji@64
|
26 '(2 . *junet*) '(3 . *euc-japan*)))
|
yuuji@64
|
27 (YaTeX-emacs-20
|
yuuji@64
|
28 ;;(cdr-safe(assq 'coding-system (assoc "Japanese" language-info-alist)))
|
yuuji@64
|
29 (list (cons
|
yuuji@64
|
30 1 (cond (YaTeX-dos 'shift_jis-dos)
|
yuuji@64
|
31 ((member 'shift_jis (coding-system-list)) 'shift_jis-unix)
|
yuuji@64
|
32 (t 'sjis)))
|
yuuji@68
|
33 '(2 . iso-2022-jp-unix)
|
yuuji@68
|
34 '(3 . euc-jp-unix))))
|
yuuji@64
|
35 "Kanji-code expression translation table.")
|
yuuji@64
|
36 (defvar YaTeX-inhibit-prefix-letter nil
|
yuuji@64
|
37 "*T for changing key definitions from [prefix] Letter to [prefix] C-Letter.")
|
yuuji@64
|
38
|
yuuji@64
|
39 (defvar YaTeX-no-begend-shortcut nil
|
yuuji@64
|
40 "*T for disabling shortcut of begin-type completion, [prefix] b d, etc.")
|
yuuji@64
|
41
|
yuuji@64
|
42 (defvar YaTeX-default-pop-window-height 10
|
yuuji@64
|
43 "Default typesetting buffer height.
|
yuuji@64
|
44 If integer, sets the window-height of typesetting buffer.
|
yuuji@64
|
45 If string, sets the percentage of it.
|
yuuji@64
|
46 If nil, use default pop-to-buffer.")
|
yuuji@64
|
47
|
yuuji@64
|
48 (defvar YaTeX-create-file-prefix-g nil
|
yuuji@64
|
49 "*Non-nil creates new file when [prefix] g on \\include{foo}.")
|
yuuji@64
|
50
|
yuuji@64
|
51 (defvar YaTeX-nervous t
|
yuuji@64
|
52 "*If you are nervous about maintenance of yatexrc, set this value to T.
|
yuuji@64
|
53 And you will have the local dictionary.")
|
yuuji@64
|
54
|
yuuji@64
|
55 ;----------- work variables ----------------------------------------
|
yuuji@64
|
56 (defvar YaTeX-typesetting-mode-map nil
|
yuuji@64
|
57 "Keymap used in YaTeX typesetting buffer"
|
yuuji@64
|
58 )
|
yuuji@64
|
59 (if YaTeX-typesetting-mode-map nil
|
yuuji@64
|
60 (setq YaTeX-typesetting-mode-map (make-keymap))
|
yuuji@64
|
61 ;(suppress-keymap YaTeX-typesetting-mode-map t)
|
yuuji@64
|
62 (define-key YaTeX-typesetting-mode-map " " 'YaTeX-jump-error-line)
|
yuuji@64
|
63 (define-key YaTeX-typesetting-mode-map "\C-m" 'YaTeX-send-string)
|
yuuji@64
|
64 (define-key YaTeX-typesetting-mode-map "1" 'delete-other-windows)
|
yuuji@64
|
65 (define-key YaTeX-typesetting-mode-map "0" 'delete-window)
|
yuuji@64
|
66 (define-key YaTeX-typesetting-mode-map "q" 'delete-window))
|
yuuji@64
|
67
|
yuuji@64
|
68 (defvar YaTeX-parent-file nil
|
yuuji@64
|
69 "*Main LaTeX source file name used when %#! expression doesn't exist.")
|
yuuji@64
|
70 (make-variable-buffer-local 'YaTeX-parent-file)
|
yuuji@64
|
71
|
yuuji@64
|
72 ;---------- Define default key bindings on YaTeX mode map ----------
|
yuuji@64
|
73 ;;;###autoload
|
yuuji@64
|
74 (defun YaTeX-define-key (key binding &optional map)
|
yuuji@64
|
75 "Define key on YaTeX-prefix-map."
|
yuuji@64
|
76 (if YaTeX-inhibit-prefix-letter
|
yuuji@64
|
77 (let ((c (aref key 0)))
|
yuuji@64
|
78 (cond
|
yuuji@64
|
79 ((and (>= c ?a) (<= c ?z)) (aset key 0 (1+ (- c ?a))))
|
yuuji@64
|
80 ((and (>= c ?A) (<= c ?Z) (numberp YaTeX-inhibit-prefix-letter))
|
yuuji@64
|
81 (aset key 0 (1+ (- c ?A))))
|
yuuji@64
|
82 (t nil))))
|
yuuji@64
|
83 (define-key (or map YaTeX-prefix-map) key binding))
|
yuuji@64
|
84
|
yuuji@64
|
85 ;;;###autoload
|
yuuji@64
|
86 (defun YaTeX-local-table-symbol (symbol)
|
yuuji@64
|
87 "Return the lisp symbol which keeps local completion table of SYMBOL."
|
yuuji@64
|
88 (intern (concat "YaTeX$"
|
yuuji@64
|
89 default-directory
|
yuuji@64
|
90 (symbol-name symbol))))
|
yuuji@64
|
91
|
yuuji@64
|
92 ;;;###autoload
|
yuuji@64
|
93 (defun YaTeX-sync-local-table (symbol)
|
yuuji@64
|
94 "Synchronize local variable SYMBOL.
|
yuuji@64
|
95 Copy its corresponding directory dependent completion table to SYMBOL."
|
yuuji@64
|
96 (if (boundp (YaTeX-local-table-symbol symbol))
|
yuuji@64
|
97 (set symbol (symbol-value (YaTeX-local-table-symbol symbol)))))
|
yuuji@64
|
98
|
yuuji@64
|
99 (defvar YaTeX-user-table-is-read nil
|
yuuji@64
|
100 "Flag that means whether user completion table has been read or not.")
|
yuuji@64
|
101 ;;;###autoload
|
yuuji@64
|
102 (defun YaTeX-read-user-completion-table (&optional forcetoread)
|
yuuji@64
|
103 "Append user completion table of LaTeX macros"
|
yuuji@64
|
104 (let*((user-table (expand-file-name YaTeX-user-completion-table))
|
yuuji@64
|
105 (local-table (expand-file-name (file-name-nondirectory user-table)))
|
yuuji@64
|
106 var localvar localbuf (curbuf (current-buffer)) sexp)
|
yuuji@64
|
107 (if YaTeX-user-table-is-read nil
|
yuuji@64
|
108 (message "Loading user completion table")
|
yuuji@64
|
109 (if (file-exists-p user-table) (load-file user-table)
|
yuuji@64
|
110 (message "Welcome to the field of YaTeX. I'm glad to see you!")))
|
yuuji@64
|
111 (setq YaTeX-user-table-is-read t)
|
yuuji@64
|
112 (cond
|
yuuji@64
|
113 ((file-exists-p local-table)
|
yuuji@64
|
114 (set-buffer (setq localbuf (find-file-noselect local-table)))
|
yuuji@64
|
115 (widen)
|
yuuji@64
|
116 (goto-char (point-min))
|
yuuji@64
|
117 (while (re-search-forward "(setq \\([^ ]+\\)" nil t)
|
yuuji@64
|
118 (setq var (intern (buffer-substring
|
yuuji@64
|
119 (match-beginning 1) (match-end 1)))
|
yuuji@64
|
120 localvar (YaTeX-local-table-symbol var))
|
yuuji@64
|
121 (goto-char (match-beginning 0))
|
yuuji@64
|
122 (setq sexp (buffer-substring (point)
|
yuuji@64
|
123 (progn (forward-sexp) (point))))
|
yuuji@64
|
124 (set-buffer curbuf)
|
yuuji@64
|
125 (or (assq var (buffer-local-variables)) (make-local-variable var))
|
yuuji@64
|
126 (eval (read sexp))
|
yuuji@64
|
127 (or (and (boundp localvar)
|
yuuji@64
|
128 (symbol-value localvar)
|
yuuji@64
|
129 (not forcetoread))
|
yuuji@64
|
130 (set localvar (symbol-value var)))
|
yuuji@64
|
131 (set-buffer localbuf))
|
yuuji@64
|
132 (kill-buffer localbuf)))
|
yuuji@64
|
133 (set-buffer curbuf)))
|
yuuji@64
|
134
|
yuuji@64
|
135 ;;;###autoload
|
yuuji@64
|
136 (defun YaTeX-reload-dictionary ()
|
yuuji@64
|
137 "Reload local dictionary.
|
yuuji@64
|
138 Use this function after editing ./.yatexrc."
|
yuuji@64
|
139 (interactive)
|
yuuji@64
|
140 (let ((YaTeX-user-table-is-read nil))
|
yuuji@64
|
141 (YaTeX-read-user-completion-table t)))
|
yuuji@64
|
142
|
yuuji@64
|
143 ;;;###autoload
|
yuuji@64
|
144 (defun YaTeX-lookup-table (word type)
|
yuuji@64
|
145 "Lookup WORD in completion table whose type is TYPE.
|
yuuji@64
|
146 This function refers the symbol tmp-TYPE-table, user-TYPE-table, TYPE-table.
|
yuuji@64
|
147 Typically, TYPE is one of 'env, 'section, 'fontsize, 'singlecmd."
|
yuuji@64
|
148 (if (symbolp type) (setq type (symbol-name type)))
|
yuuji@64
|
149 (or (assoc word (symbol-value (intern (concat "tmp-" type "-table"))))
|
yuuji@64
|
150 (assoc word (symbol-value (intern (concat "user-" type "-table"))))
|
yuuji@64
|
151 (assoc word (symbol-value (intern (concat type "-table"))))))
|
yuuji@64
|
152
|
yuuji@64
|
153 ;;;###autoload
|
yuuji@64
|
154 (defun YaTeX-update-table (vallist default-table user-table local-table)
|
yuuji@64
|
155 "Update completion table if the car of VALLIST is not in current tables.
|
yuuji@64
|
156 Second argument DEFAULT-TABLE is the quoted symbol of default completion
|
yuuji@64
|
157 table, third argument USER-TABLE is user table which will be saved in
|
yuuji@64
|
158 YaTeX-user-completion-table, fourth argument LOCAL-TABLE should have the
|
yuuji@64
|
159 completion which is valid during current Emacs's session. If you
|
yuuji@64
|
160 want to make LOCAL-TABLE valid longer span (but restrict in this directory)
|
yuuji@64
|
161 create the file in current directory which has the same name with
|
yuuji@64
|
162 YaTeX-user-completion-table."
|
yuuji@64
|
163 (let ((car-v (car vallist)) key answer
|
yuuji@64
|
164 (file (file-name-nondirectory YaTeX-user-completion-table)))
|
yuuji@64
|
165 (cond
|
yuuji@64
|
166 ((assoc car-v (symbol-value default-table))
|
yuuji@64
|
167 nil) ;Nothing to do
|
yuuji@64
|
168 ((setq key (assoc car-v (symbol-value user-table)))
|
yuuji@64
|
169 (if (equal (cdr vallist) (cdr key)) nil
|
yuuji@64
|
170 ;; if association hits, but contents differ.
|
yuuji@64
|
171 (message
|
yuuji@64
|
172 "%s's attributes turned into %s" (car vallist) (cdr vallist))
|
yuuji@64
|
173 (set user-table (delq key (symbol-value user-table)))
|
yuuji@64
|
174 (set user-table (cons vallist (symbol-value user-table)))
|
yuuji@64
|
175 (YaTeX-update-dictionary
|
yuuji@64
|
176 YaTeX-user-completion-table user-table "user")))
|
yuuji@64
|
177 ((setq key (assoc car-v (symbol-value local-table)))
|
yuuji@64
|
178 (if (equal (cdr vallist) (cdr key)) nil
|
yuuji@64
|
179 (message
|
yuuji@64
|
180 "%s's attributes turned into %s" (car vallist) (cdr vallist))
|
yuuji@64
|
181 (set local-table (delq key (symbol-value local-table)))
|
yuuji@64
|
182 (set local-table (cons vallist (symbol-value local-table)))
|
yuuji@64
|
183 (set (YaTeX-local-table-symbol local-table) (symbol-value local-table))
|
yuuji@64
|
184 (YaTeX-update-dictionary file local-table)))
|
yuuji@64
|
185 ;; All of above cases, there are some completion in tables.
|
yuuji@64
|
186 ;; Then update tables.
|
yuuji@64
|
187 (t
|
yuuji@64
|
188 (if (not YaTeX-nervous)
|
yuuji@64
|
189 (setq answer "u")
|
yuuji@64
|
190 (message
|
yuuji@64
|
191 (cond
|
yuuji@64
|
192 (YaTeX-japan
|
yuuji@68
|
193 "`%s'の登録先: U)ユーザ辞書 L)ローカル辞書 N)メモリ D)しない")
|
yuuji@64
|
194 (t
|
yuuji@64
|
195 "Register `%s' into: U)serDic L)ocalDic N)one D)iscard"))
|
yuuji@64
|
196 (if (> (length car-v) 23)
|
yuuji@68
|
197 (concat (substring car-v 0 10) "..." (substring car-v -9))
|
yuuji@64
|
198 car-v))
|
yuuji@64
|
199 (setq answer (char-to-string (read-char))))
|
yuuji@64
|
200 (cond
|
yuuji@64
|
201 ((string-match answer "uy")
|
yuuji@64
|
202 (set user-table (cons vallist (symbol-value user-table)))
|
yuuji@64
|
203 (YaTeX-update-dictionary YaTeX-user-completion-table user-table "user")
|
yuuji@64
|
204 )
|
yuuji@64
|
205 ((string-match answer "tl")
|
yuuji@64
|
206 (set local-table (cons vallist (symbol-value local-table)))
|
yuuji@64
|
207 (set (YaTeX-local-table-symbol local-table) (symbol-value local-table))
|
yuuji@64
|
208 (YaTeX-update-dictionary file local-table))
|
yuuji@64
|
209 ((string-match answer "d") nil) ;discard it
|
yuuji@64
|
210 (t (set default-table
|
yuuji@64
|
211 (cons vallist (symbol-value default-table)))))))))
|
yuuji@64
|
212
|
yuuji@64
|
213 ;;;###autoload
|
yuuji@64
|
214 (defun YaTeX-cplread-with-learning
|
yuuji@64
|
215 (prom default-table user-table local-table
|
yuuji@64
|
216 &optional pred reqmatch init hsym)
|
yuuji@64
|
217 "Completing read with learning.
|
yuuji@64
|
218 Do a completing read with prompt PROM. Completion table is what
|
yuuji@64
|
219 DEFAULT-TABLE, USER-TABLE, LOCAL table are appended in reverse order.
|
yuuji@64
|
220 Note that these tables are passed by the symbol.
|
yuuji@64
|
221 Optional arguments PRED, REQMATH and INIT are passed to completing-read
|
yuuji@64
|
222 as its arguments PREDICATE, REQUIRE-MATCH and INITIAL-INPUT respectively.
|
yuuji@64
|
223 If optional 8th argument HSYM, history symbol, is passed, use it as
|
yuuji@64
|
224 history list variable."
|
yuuji@64
|
225 (YaTeX-sync-local-table local-table)
|
yuuji@64
|
226 (let*((table (append (symbol-value local-table)
|
yuuji@64
|
227 (symbol-value user-table)
|
yuuji@64
|
228 (symbol-value default-table)))
|
yuuji@64
|
229 (word (completing-read-with-history
|
yuuji@64
|
230 prom table pred reqmatch init hsym)))
|
yuuji@64
|
231 (if (and (string< "" word) (not (assoc word table)))
|
yuuji@64
|
232 (YaTeX-update-table (list word) default-table user-table local-table))
|
yuuji@64
|
233 word))
|
yuuji@64
|
234
|
yuuji@64
|
235 ;;;###autoload
|
yuuji@64
|
236 (defun YaTeX-update-dictionary (file symbol &optional type)
|
yuuji@64
|
237 (let ((local-table-buf (find-file-noselect file))
|
yuuji@64
|
238 (name (symbol-name symbol))
|
yuuji@64
|
239 (value (symbol-value symbol)))
|
yuuji@64
|
240 (save-excursion
|
yuuji@64
|
241 (message "Updating %s dictionary..." (or type "local"))
|
yuuji@64
|
242 (set-buffer local-table-buf)
|
yuuji@64
|
243 (goto-char (point-max))
|
yuuji@64
|
244 (search-backward (concat "(setq " name) nil t)
|
yuuji@64
|
245 (delete-region (point) (progn (forward-sexp) (point)))
|
yuuji@64
|
246 (delete-blank-lines)
|
yuuji@64
|
247 (insert "(setq " name " '(\n")
|
yuuji@64
|
248 (mapcar '(lambda (s)
|
yuuji@64
|
249 (insert (format "%s\n" (prin1-to-string s))))
|
yuuji@64
|
250 value)
|
yuuji@64
|
251 (insert "))\n\n")
|
yuuji@64
|
252 (delete-blank-lines)
|
yuuji@64
|
253 (basic-save-buffer)
|
yuuji@64
|
254 (kill-buffer local-table-buf)
|
yuuji@64
|
255 (message "Updating %s dictionary...Done" (or type "local")))))
|
yuuji@64
|
256
|
yuuji@64
|
257 ;;;###autoload
|
yuuji@64
|
258 (defun YaTeX-define-begend-key-normal (key env &optional map)
|
yuuji@64
|
259 "Define short cut YaTeX-make-begin-end key."
|
yuuji@64
|
260 (YaTeX-define-key
|
yuuji@64
|
261 key
|
yuuji@64
|
262 (list 'lambda '(arg) '(interactive "P")
|
yuuji@64
|
263 (list 'YaTeX-insert-begin-end env 'arg))
|
yuuji@64
|
264 map))
|
yuuji@64
|
265
|
yuuji@64
|
266 ;;;###autoload
|
yuuji@64
|
267 (defun YaTeX-define-begend-region-key (key env &optional map)
|
yuuji@64
|
268 "Define short cut YaTeX-make-begin-end-region key."
|
yuuji@64
|
269 (YaTeX-define-key key (list 'lambda nil '(interactive)
|
yuuji@64
|
270 (list 'YaTeX-insert-begin-end env t)) map))
|
yuuji@64
|
271
|
yuuji@64
|
272 ;;;###autoload
|
yuuji@64
|
273 (defun YaTeX-define-begend-key (key env &optional map)
|
yuuji@64
|
274 "Define short cut key for begin type completion both for normal
|
yuuji@64
|
275 and region mode. To customize YaTeX, user should use this function."
|
yuuji@64
|
276 (YaTeX-define-begend-key-normal key env map)
|
yuuji@64
|
277 (if YaTeX-inhibit-prefix-letter nil
|
yuuji@64
|
278 (YaTeX-define-begend-region-key
|
yuuji@64
|
279 (concat (upcase (substring key 0 1)) (substring key 1)) env)))
|
yuuji@64
|
280
|
yuuji@23
|
281 ;;;###autoload
|
yuuji@23
|
282 (defun YaTeX-search-active-forward (string cmntrx &optional bound err cnt func)
|
yuuji@23
|
283 "Search STRING which is not commented out by CMNTRX.
|
yuuji@23
|
284 Optional arguments after BOUND, ERR, CNT are passed literally to search-forward
|
yuuji@23
|
285 or search-backward.
|
yuuji@23
|
286 Optional sixth argument FUNC changes search-function."
|
yuuji@49
|
287 (let ((sfunc (or func 'search-forward)) found md)
|
yuuji@23
|
288 (while (and (prog1
|
yuuji@23
|
289 (setq found (funcall sfunc string bound err cnt))
|
yuuji@23
|
290 (setq md (match-data)))
|
yuuji@23
|
291 (or
|
yuuji@64
|
292 (and (eq major-mode 'yatex-mode)
|
yuuji@64
|
293 (YaTeX-in-verb-p (match-beginning 0)))
|
yuuji@23
|
294 (save-excursion
|
yuuji@23
|
295 (beginning-of-line)
|
yuuji@23
|
296 (re-search-forward cmntrx (match-beginning 0) t)))))
|
yuuji@23
|
297 (store-match-data md)
|
yuuji@23
|
298 found)
|
yuuji@23
|
299 )
|
yuuji@23
|
300
|
yuuji@23
|
301 (defun YaTeX-re-search-active-forward (regexp cmntrx &optional bound err cnt)
|
yuuji@23
|
302 "Search REGEXP backward which is not commented out by regexp CMNTRX.
|
yuuji@23
|
303 See also YaTeX-search-active-forward."
|
yuuji@23
|
304 (YaTeX-search-active-forward regexp cmntrx bound err cnt 're-search-forward)
|
yuuji@23
|
305 )
|
yuuji@23
|
306 (defun YaTeX-search-active-backward (string cmntrx &optional bound err cnt)
|
yuuji@23
|
307 "Search STRING backward which is not commented out by regexp CMNTRX.
|
yuuji@23
|
308 See also YaTeX-search-active-forward."
|
yuuji@23
|
309 (YaTeX-search-active-forward string cmntrx bound err cnt 'search-backward)
|
yuuji@23
|
310 )
|
yuuji@23
|
311 (defun YaTeX-re-search-active-backward (regexp cmntrx &optional bound err cnt)
|
yuuji@23
|
312 "Search REGEXP backward which is not commented out by regexp CMNTRX.
|
yuuji@23
|
313 See also YaTeX-search-active-forward."
|
yuuji@23
|
314 (YaTeX-search-active-forward regexp cmntrx bound err cnt 're-search-backward)
|
yuuji@23
|
315 )
|
yuuji@23
|
316
|
yuuji@23
|
317
|
yuuji@23
|
318 ;;;###autoload
|
yuuji@23
|
319 (defun YaTeX-switch-to-buffer (file &optional setbuf)
|
yuuji@23
|
320 "Switch to buffer if buffer exists, find file if not.
|
yuuji@23
|
321 Optional second arg SETBUF t make use set-buffer instead of switch-to-buffer."
|
yuuji@23
|
322 (interactive "Fswitch to file: ")
|
yuuji@52
|
323 (if (bufferp file) (setq file (buffer-file-name file)))
|
yuuji@52
|
324 (let (buf (hilit-auto-highlight (not setbuf)))
|
yuuji@52
|
325 (cond
|
yuuji@52
|
326 ((setq buf (get-file-buffer file))
|
yuuji@52
|
327 (funcall (if setbuf 'set-buffer 'switch-to-buffer)
|
yuuji@52
|
328 (get-file-buffer file))
|
yuuji@52
|
329 buf)
|
yuuji@52
|
330 ((or YaTeX-create-file-prefix-g (file-exists-p file))
|
yuuji@52
|
331 (or ;find-file returns nil but set current-buffer...
|
yuuji@52
|
332 (if setbuf (set-buffer (find-file-noselect file))
|
yuuji@52
|
333 (find-file file))
|
yuuji@52
|
334 (current-buffer)))
|
yuuji@52
|
335 (t (message "%s was not found in this directory." file)
|
yuuji@23
|
336 nil)))
|
yuuji@23
|
337 )
|
yuuji@23
|
338
|
yuuji@23
|
339 ;;;###autoload
|
yuuji@23
|
340 (defun YaTeX-switch-to-buffer-other-window (file)
|
yuuji@23
|
341 "Switch to buffer if buffer exists, find file if not."
|
yuuji@23
|
342 (interactive "Fswitch to file: ")
|
yuuji@52
|
343 (if (bufferp file) (setq file (buffer-file-name file)))
|
yuuji@52
|
344 (cond
|
yuuji@52
|
345 ((get-file-buffer file)
|
yuuji@52
|
346 (switch-to-buffer-other-window (get-file-buffer file))
|
yuuji@52
|
347 t)
|
yuuji@52
|
348 ((or YaTeX-create-file-prefix-g (file-exists-p file))
|
yuuji@52
|
349 (find-file-other-window file) t)
|
yuuji@52
|
350 (t (message "%s was not found in this directory." file)
|
yuuji@23
|
351 nil))
|
yuuji@23
|
352 )
|
yuuji@23
|
353
|
yuuji@23
|
354 (defun YaTeX-replace-format-sub (string format repl)
|
yuuji@23
|
355 (let ((beg (or (string-match (concat "^\\(%" format "\\)") string)
|
yuuji@23
|
356 (string-match (concat "[^%]\\(%" format "\\)") string)))
|
yuuji@23
|
357 (len (length format)))
|
yuuji@23
|
358 (if (null beg) string ;no conversion
|
yuuji@23
|
359 (concat
|
yuuji@23
|
360 (substring string 0 (match-beginning 1)) repl
|
yuuji@23
|
361 (substring string (match-end 1)))))
|
yuuji@23
|
362 )
|
yuuji@23
|
363
|
yuuji@23
|
364 ;;;###autoload
|
yuuji@23
|
365 (defun YaTeX-replace-format (string format repl)
|
yuuji@23
|
366 "In STRING, replace first appearance of FORMAT to REPL as if
|
yuuji@23
|
367 function `format' does. FORMAT does not contain `%'"
|
yuuji@23
|
368 (let ((ans string))
|
yuuji@23
|
369 (while (not (string=
|
yuuji@23
|
370 ans (setq string (YaTeX-replace-format-sub ans format repl))))
|
yuuji@23
|
371 (setq ans string))
|
yuuji@23
|
372 string)
|
yuuji@23
|
373 )
|
yuuji@23
|
374
|
yuuji@23
|
375 ;;;###autoload
|
yuuji@23
|
376 (defun YaTeX-replace-format-args (string &rest args)
|
yuuji@23
|
377 "Translate the argument mark #1, #2, ... #n in the STRING into the
|
yuuji@23
|
378 corresponding real arguments ARGS."
|
yuuji@23
|
379 (let ((argp 1))
|
yuuji@23
|
380 (while args
|
yuuji@23
|
381 (setq string
|
yuuji@23
|
382 (YaTeX-replace-format string (int-to-string argp) (car args)))
|
yuuji@23
|
383 (setq args (cdr args) argp (1+ argp))))
|
yuuji@23
|
384 string
|
yuuji@23
|
385 )
|
yuuji@23
|
386
|
yuuji@23
|
387 ;;;###autoload
|
yuuji@23
|
388 (defun rindex (string char)
|
yuuji@23
|
389 (let ((pos (1- (length string)))(index -1))
|
yuuji@23
|
390 (while (>= pos 0)
|
yuuji@23
|
391 (cond
|
yuuji@23
|
392 ((= (aref string pos) char)
|
yuuji@23
|
393 (setq index pos) (setq pos -1))
|
yuuji@23
|
394 (t (setq pos (1- pos))))
|
yuuji@23
|
395 )
|
yuuji@64
|
396 index))
|
yuuji@64
|
397
|
yuuji@64
|
398 ;;;###autoload
|
yuuji@64
|
399 (defun point-beginning-of-line ()
|
yuuji@64
|
400 (save-excursion (beginning-of-line)(point)))
|
yuuji@64
|
401
|
yuuji@64
|
402 ;;;###autoload
|
yuuji@64
|
403 (defun point-end-of-line ()
|
yuuji@64
|
404 (save-excursion (end-of-line)(point)))
|
yuuji@64
|
405
|
yuuji@23
|
406
|
yuuji@23
|
407 ;;;###autoload
|
yuuji@23
|
408 (defun YaTeX-showup-buffer (buffer &optional func select)
|
yuuji@23
|
409 "Make BUFFER show up in certain window (but current window)
|
yuuji@23
|
410 that gives the maximum value by the FUNC. FUNC should take an argument
|
yuuji@23
|
411 of its window object. Non-nil for optional third argument SELECT selects
|
yuuji@49
|
412 that window. This function never selects minibuffer window."
|
yuuji@53
|
413 (or (and (if (and YaTeX-emacs-19 select)
|
yuuji@47
|
414 (get-buffer-window buffer t)
|
yuuji@47
|
415 (get-buffer-window buffer))
|
yuuji@47
|
416 (progn
|
yuuji@47
|
417 (if select
|
yuuji@51
|
418 (goto-buffer-window buffer))
|
yuuji@47
|
419 t))
|
yuuji@23
|
420 (let ((window (selected-window))
|
yuuji@23
|
421 (wlist (YaTeX-window-list)) win w (x 0))
|
yuuji@23
|
422 (cond
|
yuuji@23
|
423 ((> (length wlist) 2)
|
yuuji@23
|
424 (if func
|
yuuji@23
|
425 (while wlist
|
yuuji@23
|
426 (setq w (car wlist))
|
yuuji@23
|
427 (if (and (not (eq window w))
|
yuuji@23
|
428 (> (funcall func w) x))
|
yuuji@23
|
429 (setq win w x (funcall func w)))
|
yuuji@23
|
430 (setq wlist (cdr wlist)))
|
yuuji@23
|
431 (setq win (get-lru-window)))
|
yuuji@23
|
432 (select-window win)
|
yuuji@23
|
433 (switch-to-buffer buffer)
|
yuuji@23
|
434 (or select (select-window window)))
|
yuuji@23
|
435 ((= (length wlist) 2)
|
yuuji@49
|
436 ;(other-window 1);This does not work properly on Emacs-19
|
yuuji@49
|
437 (select-window (get-lru-window))
|
yuuji@23
|
438 (switch-to-buffer buffer)
|
yuuji@23
|
439 (or select (select-window window)))
|
yuuji@23
|
440 (t ;if one-window
|
yuuji@23
|
441 (cond
|
yuuji@47
|
442 ((and YaTeX-emacs-19 (get-buffer-window buffer t))
|
yuuji@47
|
443 nil) ;if found in other frame
|
yuuji@23
|
444 (YaTeX-default-pop-window-height
|
yuuji@51
|
445 (split-window-calculate-height YaTeX-default-pop-window-height)
|
yuuji@59
|
446 ;;(pop-to-buffer buffer) ;damn! emacs-19.30
|
yuuji@59
|
447 (select-window (next-window nil 1))
|
yuuji@59
|
448 (switch-to-buffer (get-buffer-create buffer))
|
yuuji@23
|
449 (or select (select-window window)))
|
yuuji@23
|
450 (t nil)))
|
yuuji@23
|
451 )))
|
yuuji@23
|
452 )
|
yuuji@23
|
453
|
yuuji@23
|
454 ;;;###autoload
|
yuuji@51
|
455 (defun split-window-calculate-height (height)
|
yuuji@51
|
456 "Split current window wight specified HEIGHT.
|
yuuji@59
|
457 If HEIGHT is number, make a new window that has HEIGHT lines.
|
yuuji@59
|
458 If HEIGHT is string, make a new window that occupies HEIGT % of screen height.
|
yuuji@51
|
459 Otherwise split window conventionally."
|
yuuji@59
|
460 (if (one-window-p t)
|
yuuji@51
|
461 (split-window
|
yuuji@51
|
462 (selected-window)
|
yuuji@51
|
463 (max
|
yuuji@51
|
464 (min
|
yuuji@51
|
465 (- (screen-height)
|
yuuji@59
|
466 (if (numberp height)
|
yuuji@59
|
467 (+ height 2)
|
yuuji@51
|
468 (/ (* (screen-height)
|
yuuji@59
|
469 (string-to-int height))
|
yuuji@51
|
470 100)))
|
yuuji@51
|
471 (- (screen-height) window-min-height 1))
|
yuuji@51
|
472 window-min-height)))
|
yuuji@51
|
473 )
|
yuuji@51
|
474
|
yuuji@51
|
475 ;;;###autoload
|
yuuji@23
|
476 (defun YaTeX-window-list ()
|
yuuji@23
|
477 (let*((curw (selected-window)) (win curw) (wlist (list curw)))
|
yuuji@23
|
478 (while (not (eq curw (setq win (next-window win))))
|
yuuji@23
|
479 (or (eq win (minibuffer-window))
|
yuuji@23
|
480 (setq wlist (cons win wlist))))
|
yuuji@23
|
481 wlist)
|
yuuji@23
|
482 )
|
yuuji@23
|
483
|
yuuji@23
|
484 ;;;###autoload
|
yuuji@23
|
485 (defun substitute-all-key-definition (olddef newdef keymap)
|
yuuji@23
|
486 "Replace recursively OLDDEF with NEWDEF for any keys in KEYMAP now
|
yuuji@23
|
487 defined as OLDDEF. In other words, OLDDEF is replaced with NEWDEF
|
yuuji@23
|
488 where ever it appears."
|
yuuji@68
|
489 (if YaTeX-emacs-19
|
yuuji@68
|
490 (substitute-key-definition olddef newdef keymap global-map)
|
yuuji@68
|
491 (mapcar
|
yuuji@68
|
492 (function (lambda (key) (define-key keymap key newdef)))
|
yuuji@68
|
493 (where-is-internal olddef keymap))))
|
yuuji@23
|
494
|
yuuji@23
|
495 ;;;###autoload
|
yuuji@23
|
496 (defun YaTeX-match-string (n &optional m)
|
yuuji@23
|
497 "Return (buffer-substring (match-beginning n) (match-beginning m))."
|
yuuji@23
|
498 (if (match-beginning n)
|
yuuji@23
|
499 (buffer-substring (match-beginning n)
|
yuuji@49
|
500 (match-end (or m n))))
|
yuuji@23
|
501 )
|
yuuji@23
|
502
|
yuuji@23
|
503 ;;;###autoload
|
yuuji@23
|
504 (defun YaTeX-minibuffer-complete ()
|
yuuji@49
|
505 "Complete in minibuffer.
|
yuuji@51
|
506 If the symbol 'delim is bound and is string, its value is assumed to be
|
yuuji@49
|
507 the character class of delimiters. Completion will be performed on
|
yuuji@51
|
508 the last field separated by those delimiters.
|
yuuji@51
|
509 If the symbol 'quick is bound and is 't, when the try-completion results
|
yuuji@51
|
510 in t, exit minibuffer immediately."
|
yuuji@23
|
511 (interactive)
|
yuuji@51
|
512 (let ((md (match-data)) beg word compl
|
yuuji@51
|
513 (quick (and (boundp 'quick) (eq quick t)))
|
yuuji@51
|
514 (displist ;function to display completion-list
|
yuuji@51
|
515 (function
|
yuuji@51
|
516 (lambda ()
|
yuuji@51
|
517 (with-output-to-temp-buffer "*Completions*"
|
yuuji@51
|
518 (display-completion-list
|
yuuji@51
|
519 (all-completions word minibuffer-completion-table)))))))
|
yuuji@49
|
520 (setq beg (if (and (boundp 'delim) (stringp delim))
|
yuuji@23
|
521 (save-excursion
|
yuuji@23
|
522 (skip-chars-backward (concat "^" delim))
|
yuuji@49
|
523 (point))
|
yuuji@23
|
524 (point-min))
|
yuuji@23
|
525 word (buffer-substring beg (point-max))
|
yuuji@23
|
526 compl (try-completion word minibuffer-completion-table))
|
yuuji@23
|
527 (cond
|
yuuji@49
|
528 ((eq compl t)
|
yuuji@51
|
529 (if quick (exit-minibuffer)
|
yuuji@51
|
530 (let ((p (point)) (max (point-max)))
|
yuuji@51
|
531 (unwind-protect
|
yuuji@51
|
532 (progn
|
yuuji@51
|
533 (goto-char max)
|
yuuji@51
|
534 (insert " [Sole completion]")
|
yuuji@51
|
535 (goto-char p)
|
yuuji@51
|
536 (sit-for 1))
|
yuuji@51
|
537 (delete-region max (point-max))
|
yuuji@51
|
538 (goto-char p)))))
|
yuuji@23
|
539 ((eq compl nil)
|
yuuji@23
|
540 (ding)
|
yuuji@23
|
541 (save-excursion
|
yuuji@23
|
542 (let (p)
|
yuuji@51
|
543 (unwind-protect
|
yuuji@51
|
544 (progn
|
yuuji@51
|
545 (goto-char (setq p (point-max)))
|
yuuji@51
|
546 (insert " [No match]")
|
yuuji@51
|
547 (goto-char p)
|
yuuji@51
|
548 (sit-for 2))
|
yuuji@51
|
549 (delete-region p (point-max))))))
|
yuuji@23
|
550 ((string= compl word)
|
yuuji@51
|
551 (funcall displist))
|
yuuji@23
|
552 (t (delete-region beg (point-max))
|
yuuji@51
|
553 (insert compl)
|
yuuji@51
|
554 (if quick
|
yuuji@51
|
555 (if (eq (try-completion compl minibuffer-completion-table) t)
|
yuuji@51
|
556 (exit-minibuffer)
|
yuuji@51
|
557 (funcall displist)))))
|
yuuji@49
|
558 (store-match-data md))
|
yuuji@23
|
559 )
|
yuuji@23
|
560
|
yuuji@51
|
561 (defun YaTeX-minibuffer-quick-complete ()
|
yuuji@51
|
562 "Set 'quick to 't and call YaTeX-minibuffer-complete.
|
yuuji@51
|
563 See documentation of YaTeX-minibuffer-complete."
|
yuuji@51
|
564 (interactive)
|
yuuji@51
|
565 (let ((quick t))
|
yuuji@51
|
566 (self-insert-command 1)
|
yuuji@51
|
567 (YaTeX-minibuffer-complete)))
|
yuuji@51
|
568
|
yuuji@51
|
569 (defun foreach-buffers (pattern job)
|
yuuji@51
|
570 "For each buffer which matches with PATTERN, do JOB."
|
yuuji@51
|
571 (let ((list (buffer-list)))
|
yuuji@51
|
572 (save-excursion
|
yuuji@51
|
573 (while list
|
yuuji@51
|
574 (set-buffer (car list))
|
yuuji@51
|
575 (if (or (and (stringp pattern)
|
yuuji@51
|
576 (buffer-file-name)
|
yuuji@51
|
577 (string-match pattern (buffer-file-name)))
|
yuuji@51
|
578 (and (symbolp pattern) major-mode (eq major-mode pattern)))
|
yuuji@51
|
579 (eval job))
|
yuuji@51
|
580 (setq list (cdr list)))))
|
yuuji@51
|
581 )
|
yuuji@51
|
582
|
yuuji@51
|
583 (defun goto-buffer-window (buffer)
|
yuuji@51
|
584 "Select window which is bound to BUFFER.
|
yuuji@51
|
585 If no such window exist, switch to buffer BUFFER."
|
yuuji@52
|
586 (interactive "BGoto buffer: ")
|
yuuji@51
|
587 (if (stringp buffer)
|
yuuji@51
|
588 (setq buffer (or (get-file-buffer buffer) (get-buffer buffer))))
|
yuuji@51
|
589 (if (get-buffer buffer)
|
yuuji@51
|
590 (cond
|
yuuji@51
|
591 ((get-buffer-window buffer)
|
yuuji@51
|
592 (select-window (get-buffer-window buffer)))
|
yuuji@51
|
593 ((and YaTeX-emacs-19 (get-buffer-window buffer t))
|
yuuji@51
|
594 (let*((win (get-buffer-window buffer t))
|
yuuji@51
|
595 (frame (window-frame win)))
|
yuuji@51
|
596 (select-frame frame)
|
yuuji@51
|
597 (raise-frame frame)
|
yuuji@51
|
598 (focus-frame frame)
|
yuuji@51
|
599 (select-window win)
|
yuuji@51
|
600 (set-mouse-position frame 0 0)
|
yuuji@51
|
601 (and (featurep 'windows) (fboundp 'win:adjust-window)
|
yuuji@51
|
602 (win:adjust-window))))
|
yuuji@54
|
603 ((and (featurep 'windows) (fboundp 'win:get-buffer-window)
|
yuuji@56
|
604 (let ((w (win:get-buffer-window buffer)))
|
yuuji@56
|
605 (and w (win:switch-window w))))
|
yuuji@54
|
606 (select-window (get-buffer-window buffer)))
|
yuuji@51
|
607 (t (switch-to-buffer buffer))))
|
yuuji@51
|
608 )
|
yuuji@51
|
609
|
yuuji@51
|
610 ;; Here starts the functions which support gmhist-vs-Emacs19 compatible
|
yuuji@51
|
611 ;; reading with history.
|
yuuji@51
|
612 ;;;###autoload
|
yuuji@51
|
613 (defun completing-read-with-history
|
yuuji@51
|
614 (prompt table &optional predicate must-match initial hsym)
|
yuuji@51
|
615 "Completing read with general history: gmhist, Emacs-19."
|
yuuji@51
|
616 (let ((minibuffer-history
|
yuuji@51
|
617 (or (symbol-value hsym)
|
yuuji@51
|
618 (and (boundp 'minibuffer-history) minibuffer-history)))
|
yuuji@51
|
619 (minibuffer-history-symbol (or hsym 'minibuffer-history)))
|
yuuji@51
|
620 (prog1
|
yuuji@51
|
621 (if (fboundp 'completing-read-with-history-in)
|
yuuji@51
|
622 (completing-read-with-history-in
|
yuuji@51
|
623 minibuffer-history-symbol prompt table predicate must-match initial)
|
yuuji@51
|
624 (completing-read prompt table predicate must-match initial))
|
yuuji@51
|
625 (if (and YaTeX-emacs-19 hsym) (set hsym minibuffer-history)))))
|
yuuji@51
|
626
|
yuuji@51
|
627 ;;;###autoload
|
yuuji@51
|
628 (defun read-from-minibuffer-with-history (prompt &optional init map read hsym)
|
yuuji@51
|
629 "Read from minibuffer with general history: gmhist, Emacs-19."
|
yuuji@51
|
630 (cond
|
yuuji@51
|
631 (YaTeX-emacs-19
|
yuuji@51
|
632 (read-from-minibuffer prompt init map read hsym))
|
yuuji@51
|
633 (t
|
yuuji@51
|
634 (let ((minibuffer-history-symbol hsym))
|
yuuji@51
|
635 (read-from-minibuffer prompt init map read)))))
|
yuuji@51
|
636
|
yuuji@51
|
637 ;;;###autoload
|
yuuji@51
|
638 (defun read-string-with-history (prompt &optional init hsym)
|
yuuji@51
|
639 "Read string with history: gmhist(Emacs-18) and Emacs-19."
|
yuuji@51
|
640 (cond
|
yuuji@51
|
641 (YaTeX-emacs-19
|
yuuji@51
|
642 (read-from-minibuffer prompt init minibuffer-local-map nil hsym))
|
yuuji@51
|
643 ((featurep 'gmhist-mh)
|
yuuji@51
|
644 (read-with-history-in hsym prompt init))
|
yuuji@51
|
645 (t (read-string prompt init))))
|
yuuji@23
|
646
|
yuuji@53
|
647 ;;;
|
yuuji@53
|
648 ;; Interface function for windows.el
|
yuuji@53
|
649 ;;;
|
yuuji@53
|
650 ;;;###autoload
|
yuuji@53
|
651 (defun YaTeX-switch-to-window ()
|
yuuji@53
|
652 "Switch to windows.el's window decided by last pressed key."
|
yuuji@53
|
653 (interactive)
|
yuuji@53
|
654 (or (featurep 'windows) (error "Why don't you use `windows.el'?"))
|
yuuji@53
|
655 (win-switch-to-window 1 (- last-command-char win:base-key)))
|
yuuji@53
|
656
|
yuuji@64
|
657 ;;;###autoload
|
yuuji@64
|
658 (defun YaTeX-reindent (col)
|
yuuji@64
|
659 "Remove current indentation and reindento to COL column."
|
yuuji@64
|
660 (save-excursion
|
yuuji@64
|
661 (beginning-of-line)
|
yuuji@64
|
662 (skip-chars-forward " \t")
|
yuuji@64
|
663 (if (/= col (current-column))
|
yuuji@64
|
664 (progn
|
yuuji@64
|
665 (delete-region (point) (progn (beginning-of-line) (point)))
|
yuuji@64
|
666 (indent-to col))))
|
yuuji@64
|
667 (skip-chars-forward " \t" (point-end-of-line)))
|
yuuji@64
|
668
|
yuuji@64
|
669 (defun YaTeX-inner-environment (&optional quick)
|
yuuji@64
|
670 "Return current inner-most environment.
|
yuuji@64
|
671 Non-nil for optional argument QUICK restricts search bound to most
|
yuuji@64
|
672 recent sectioning command. Matching point is stored to property 'point
|
yuuji@64
|
673 of 'YaTeX-inner-environment, which can be referred by
|
yuuji@64
|
674 (get 'YaTeX-inner-environment 'point)."
|
yuuji@64
|
675 (let*((nest 0)
|
yuuji@64
|
676 (beg (YaTeX-replace-format-args
|
yuuji@64
|
677 (regexp-quote YaTeX-struct-begin)
|
yuuji@64
|
678 ;YaTeX-struct-begin ;=== TENTATIVE!! ==
|
yuuji@64
|
679 YaTeX-struct-name-regexp
|
yuuji@64
|
680 (if (eq major-mode 'yahtml-mode) "\\s *.*" "")
|
yuuji@64
|
681 ""))
|
yuuji@64
|
682 (end (YaTeX-replace-format-args
|
yuuji@64
|
683 (regexp-quote YaTeX-struct-end)
|
yuuji@64
|
684 YaTeX-struct-name-regexp "" ""))
|
yuuji@64
|
685 (begend (concat "\\(" beg "\\)\\|\\(" end "\\)"))
|
yuuji@64
|
686 bound m0
|
yuuji@64
|
687 (htmlp (eq major-mode 'yahtml-mode))
|
yuuji@64
|
688 (open
|
yuuji@64
|
689 (concat "^" (or (cdr (assq major-mode '((yahtml-mode . "<")))) "{")))
|
yuuji@64
|
690 (close
|
yuuji@64
|
691 (concat "^"
|
yuuji@64
|
692 (or (cdr(assq major-mode '((yahtml-mode . "\n\t >")))) "}"))))
|
yuuji@64
|
693 (save-excursion
|
yuuji@64
|
694 (if quick
|
yuuji@64
|
695 (setq bound
|
yuuji@64
|
696 (save-excursion
|
yuuji@64
|
697 (if htmlp
|
yuuji@64
|
698 ;;(re-search-backward YaTeX-sectioning-regexp nil 1)
|
yuuji@64
|
699 (goto-char (point-min)) ;Is this enough? 97/6/26
|
yuuji@64
|
700 (YaTeX-re-search-active-backward
|
yuuji@64
|
701 (concat YaTeX-ec-regexp
|
yuuji@64
|
702 "\\(" YaTeX-sectioning-regexp "\\)\\*?{")
|
yuuji@64
|
703 YaTeX-comment-prefix nil 1))
|
yuuji@64
|
704 (or (bobp) (end-of-line))
|
yuuji@64
|
705 (point))))
|
yuuji@64
|
706 (if (catch 'begin
|
yuuji@64
|
707 (if (and (numberp bound) (< (point) bound)) (throw 'begin nil))
|
yuuji@64
|
708 (while (YaTeX-re-search-active-backward
|
yuuji@64
|
709 begend YaTeX-comment-prefix bound t)
|
yuuji@64
|
710 (setq m0 (match-beginning 0))
|
yuuji@64
|
711 (if (looking-at end) ;;(match-beginning 2)
|
yuuji@64
|
712 (setq nest (1+ nest))
|
yuuji@64
|
713 (setq nest (1- nest)))
|
yuuji@64
|
714 (if (< nest 0)
|
yuuji@64
|
715 (progn
|
yuuji@64
|
716 (put 'YaTeX-inner-environment 'point m0)
|
yuuji@64
|
717 (goto-char m0)
|
yuuji@64
|
718 (put 'YaTeX-inner-environment 'indent (current-column))
|
yuuji@64
|
719 (throw 'begin t)))))
|
yuuji@64
|
720 (buffer-substring
|
yuuji@64
|
721 (progn (skip-chars-forward open) (1+ (point)))
|
yuuji@64
|
722 (progn (skip-chars-forward close) (point))))))
|
yuuji@64
|
723 )
|
yuuji@64
|
724
|
yuuji@64
|
725 (defun YaTeX-end-environment ()
|
yuuji@64
|
726 "Close opening environment"
|
yuuji@64
|
727 (interactive)
|
yuuji@64
|
728 (let ((env (YaTeX-inner-environment)))
|
yuuji@64
|
729 (if (not env) (error "No premature environment")
|
yuuji@64
|
730 (save-excursion
|
yuuji@64
|
731 (if (YaTeX-search-active-forward
|
yuuji@64
|
732 (YaTeX-replace-format-args YaTeX-struct-end env "" "")
|
yuuji@64
|
733 YaTeX-comment-prefix nil t)
|
yuuji@64
|
734 (if (y-or-n-p
|
yuuji@64
|
735 (concat "Environment `" env
|
yuuji@64
|
736 "' may be already closed. Force close?"))
|
yuuji@64
|
737 nil
|
yuuji@64
|
738 (error "end environment aborted."))))
|
yuuji@64
|
739 (message "") ;Erase (y or n) message.
|
yuuji@64
|
740 (YaTeX-insert-struc 'end env)
|
yuuji@64
|
741 (save-excursion
|
yuuji@64
|
742 (goto-char (or (get 'YaTeX-inner-environment 'point) (match-end 0)))
|
yuuji@64
|
743 (if (pos-visible-in-window-p)
|
yuuji@64
|
744 (sit-for (if YaTeX-dos 2 1))
|
yuuji@64
|
745 (message "Matches with %s at line %d"
|
yuuji@64
|
746 (YaTeX-replace-format-args YaTeX-struct-begin env "" "")
|
yuuji@64
|
747 (count-lines (point-min) (point)))))))
|
yuuji@64
|
748 )
|
yuuji@64
|
749
|
yuuji@64
|
750 ;;;VER2
|
yuuji@64
|
751 (defun YaTeX-insert-struc (what env)
|
yuuji@64
|
752 (cond
|
yuuji@64
|
753 ((eq what 'begin)
|
yuuji@64
|
754 (insert (YaTeX-replace-format-args
|
yuuji@64
|
755 YaTeX-struct-begin env (YaTeX-addin env))))
|
yuuji@64
|
756 ((eq what 'end)
|
yuuji@64
|
757 (insert (YaTeX-replace-format-args YaTeX-struct-end env)))
|
yuuji@64
|
758 (t nil))
|
yuuji@64
|
759 )
|
yuuji@64
|
760
|
yuuji@64
|
761 ;;; Function for menu support
|
yuuji@64
|
762 (defun YaTeX-define-menu (keymap bindlist)
|
yuuji@64
|
763 "Define KEYMAP(symbol)'s menu-bindings according to BINDLIST.
|
yuuji@64
|
764 KEYMAP should be a quoted symbol of newly allocated keymap.
|
yuuji@64
|
765 BINDLIST consists of binding list. Each element is as follows.
|
yuuji@64
|
766
|
yuuji@64
|
767 '(menusymbol DOC_String . contents)
|
yuuji@64
|
768
|
yuuji@64
|
769 CONTENTS is one of lambda-form, interactive function, or other keymap.
|
yuuji@64
|
770 See yatex19.el for example."
|
yuuji@64
|
771 (cond
|
yuuji@64
|
772 ((featurep 'xemacs)
|
yuuji@64
|
773 (let (name)
|
yuuji@64
|
774 (if (keymapp (symbol-value keymap))
|
yuuji@64
|
775 (progn
|
yuuji@64
|
776 (setq name (keymap-name (symbol-value keymap)))
|
yuuji@64
|
777 (set keymap nil))
|
yuuji@64
|
778 (setq name (car (symbol-value keymap)))
|
yuuji@64
|
779 (set keymap (cdr (symbol-value keymap))))
|
yuuji@64
|
780 (mapcar
|
yuuji@64
|
781 (function
|
yuuji@64
|
782 (lambda (bind)
|
yuuji@64
|
783 (setq bind (cdr bind))
|
yuuji@64
|
784 (if (eq (car-safe (cdr bind)) 'lambda)
|
yuuji@64
|
785 (setcar (cdr bind) 'progn))
|
yuuji@64
|
786 (if (stringp (car-safe (cdr bind)))
|
yuuji@64
|
787 (set keymap
|
yuuji@64
|
788 (cons (cdr bind) (symbol-value keymap)))
|
yuuji@64
|
789 (set keymap
|
yuuji@64
|
790 (cons (vector (car bind) (cdr bind) t)
|
yuuji@64
|
791 (symbol-value keymap))))))
|
yuuji@64
|
792 bindlist)
|
yuuji@64
|
793 (set keymap (cons name (symbol-value keymap)))))
|
yuuji@64
|
794 (t
|
yuuji@64
|
795 (mapcar
|
yuuji@64
|
796 (function
|
yuuji@64
|
797 (lambda (bind)
|
yuuji@64
|
798 (define-key (symbol-value keymap) (vector (car bind)) (cdr bind))))
|
yuuji@64
|
799 bindlist))))
|
yuuji@64
|
800
|
yuuji@64
|
801
|
yuuji@68
|
802 ;;;
|
yuuji@68
|
803 ;; Functions for the Installation time
|
yuuji@68
|
804 ;;;
|
yuuji@64
|
805
|
yuuji@58
|
806 (defun bcf-and-exit ()
|
yuuji@58
|
807 "Byte compile rest of argument and kill-emacs."
|
yuuji@58
|
808 (if command-line-args-left
|
yuuji@68
|
809 (let ((load-path (cons "." load-path)))
|
yuuji@68
|
810 (and (fboundp 'set-language-environment)
|
yuuji@68
|
811 (featurep 'mule)
|
yuuji@68
|
812 (set-language-environment "Japanese"))
|
yuuji@58
|
813 (mapcar 'byte-compile-file command-line-args-left)
|
yuuji@58
|
814 (kill-emacs))))
|
yuuji@64
|
815
|
yuuji@58
|
816
|
yuuji@23
|
817 (provide 'yatexlib)
|