rev |
line source |
yuuji@9
|
1 ;;; -*- Emacs-Lisp -*-
|
yuuji@23
|
2 ;;; YaTeX add-in function generator.
|
yuuji@52
|
3 ;;; yatexgen.el rev.5
|
yuuji@79
|
4 ;;; (c)1991-1995,1999,2000 by HIROSE Yuuji.[yuuji@yatex.org]
|
yuuji@79
|
5 ;;; Last modified Fri Jun 27 12:09:37 2003 on firestorm
|
yuuji@9
|
6 ;;; $Id$
|
yuuji@9
|
7
|
yuuji@9
|
8 (require 'yatex)
|
yuuji@9
|
9
|
yuuji@9
|
10 (defmacro YaTeX-setq (var japanese english)
|
yuuji@9
|
11 (list 'setq var
|
yuuji@9
|
12 (if YaTeX-japan japanese english))
|
yuuji@9
|
13 )
|
yuuji@9
|
14
|
yuuji@9
|
15 (put 'YaTeX-setq 'lisp-indent-hook 1)
|
yuuji@9
|
16
|
yuuji@9
|
17 (YaTeX-setq YaTeX-generate-initial-message
|
yuuji@9
|
18 " 自動生成モードへようこそ!!
|
yuuji@9
|
19
|
yuuji@9
|
20 初めてやる人はこのバッファの例にしたがって指示通りにやって練習してね。
|
yuuji@9
|
21 本番の時もこのバッファに出るメッセージを *よく読んで* 操作しないとう
|
yuuji@9
|
22 まく関数が作れないよ!!
|
yuuji@9
|
23
|
yuuji@9
|
24 ではリターンキーを押して下さい。"
|
yuuji@9
|
25 " Welcome to auto-generation mode!!
|
yuuji@9
|
26
|
yuuji@9
|
27 If this is your first trial, exercise this according to example and
|
yuuji@9
|
28 following my messages. Then, at making actual function, operate
|
yuuji@9
|
29 reading my messages *carefully*, or you'll fail to generate appropriate
|
yuuji@9
|
30 function.
|
yuuji@9
|
31
|
yuuji@9
|
32 Hit return key!"
|
yuuji@9
|
33 )
|
yuuji@9
|
34
|
yuuji@9
|
35 (YaTeX-setq YaTeX-generate-start-message
|
yuuji@9
|
36 "さぁはじめるよ.\n1.登録したい補完をやってみて.
|
yuuji@9
|
37 たとえば section 型補完の \\documentstyle だったら \\documentstyle{}
|
yuuji@9
|
38 だけをいれてみてね. ちゃんと『〜型補完』を使わないとダメよ!。
|
yuuji@9
|
39 で、おわったらりたーん!!"
|
yuuji@9
|
40 "Let's begin completion for which you want to make add-in function.
|
yuuji@9
|
41 If you want to make add-in function for \\documentstyle input only
|
yuuji@9
|
42 `\\documentstyle{}' *with* completion of yatex-mode.
|
yuuji@9
|
43 If you finish this, please press RET."
|
yuuji@9
|
44 )
|
yuuji@9
|
45
|
yuuji@9
|
46 (YaTeX-setq YaTeX-generate-abort-message
|
yuuji@9
|
47 "やめた、やめた〜いめんどくせ〜"
|
yuuji@9
|
48 "Aborted."
|
yuuji@9
|
49 )
|
yuuji@9
|
50
|
yuuji@9
|
51 (YaTeX-setq YaTeX-generate-same-message
|
yuuji@9
|
52 "それじゃ、なにも変わってねぇだろーが! やめた。"
|
yuuji@9
|
53 "I found no difference between them. So I'm quitting."
|
yuuji@9
|
54 )
|
yuuji@9
|
55
|
yuuji@9
|
56 (YaTeX-setq YaTeX-generate-invalid-message
|
yuuji@9
|
57 "それは、ちと無理というものじゃ."
|
yuuji@9
|
58 "It's impossible."
|
yuuji@9
|
59 )
|
yuuji@9
|
60
|
yuuji@9
|
61 (YaTeX-setq YaTeX-generate-idontknow-message
|
yuuji@9
|
62 "う〜ん、難しくてよくわからないなぁ。ばかでごめんねェ〜"
|
yuuji@9
|
63 "Sorry I can't tell your adding method."
|
yuuji@9
|
64 )
|
yuuji@9
|
65
|
yuuji@9
|
66 (YaTeX-setq YaTeX-generate-confirm-message
|
yuuji@9
|
67 "ということは、付け足したい部分はこれでいいのね"
|
yuuji@9
|
68 "Is it additional string of add-in function?"
|
yuuji@9
|
69 )
|
yuuji@9
|
70
|
yuuji@9
|
71 (YaTeX-setq YaTeX-generate-output-message
|
yuuji@9
|
72 "2.じゃ、それにくっつけたいものを *カーソルの位置に* 足してみて.
|
yuuji@9
|
73 さっきの \\documentstyle{} の例だと \\documentstyle[12pt]{} とかにするの。
|
yuuji@9
|
74 しつこいようだけど、今の位置からカーソル動かしちゃダメよ!!
|
yuuji@9
|
75 で、またおわったらりたーん!!"
|
yuuji@9
|
76 "2.Then input additional string *at CURSOR POSITION*
|
yuuji@9
|
77 According to last example \\documentstyle{},
|
yuuji@9
|
78 modify it \\documentstyle[12pt]{}. RET to finish."
|
yuuji@9
|
79 )
|
yuuji@9
|
80
|
yuuji@9
|
81 (YaTeX-setq YaTeX-generate-put-arg-message
|
yuuji@9
|
82 "3.このうち、キーボードから読み込んで欲しい文字列を順に入れて。
|
yuuji@9
|
83 さっきの \\documentstyle[12pt]{} だったら、付加する文字は[12pt]だけど
|
yuuji@9
|
84 手で入れたいのは 12pt の部分だけですね。
|
yuuji@9
|
85 で、全部入れ終ったら、りたーんだけうってね!!"
|
yuuji@9
|
86 "3.In this string, extract string which you want to input from key
|
yuuji@9
|
87 board with quiry afterwards. For example, though additional string is
|
yuuji@9
|
88 \\documentstyle[12pt]{}, but you want enter only `12pt' by hand.
|
yuuji@9
|
89 RET to finish!"
|
yuuji@9
|
90 )
|
yuuji@9
|
91
|
yuuji@9
|
92 (YaTeX-setq YaTeX-generate-read-prompt-message
|
yuuji@9
|
93 "4.では、あとでこれらの文字列を読み込む時に、どういうプロンプトを
|
yuuji@9
|
94 出したいですか? 順に入れて下さい。面倒なら単にリターンを打ってね。
|
yuuji@9
|
95 さっきの 12pt の部分だったら、『サイズは』とかがおすすめ。"
|
yuuji@9
|
96 "4.When you use this add-in function afterwards, what message
|
yuuji@9
|
97 do you like to be prompted with to enter these values. In last
|
yuuji@9
|
98 example `12pt', typical prompt string may be `Size?: '."
|
yuuji@9
|
99 )
|
yuuji@9
|
100
|
yuuji@9
|
101 (YaTeX-setq YaTeX-generate-done-message
|
yuuji@9
|
102 "よし! これが、君の作りたかった関数だ。~/.emacs にでも入れてせいぜい
|
yuuji@9
|
103 楽してくれ。このバッファ(*ご案内*)を yatex-mode にしておくから
|
yuuji@9
|
104 できた関数が本当にお望みの動作をするか確かめてみるといいかもね。
|
yuuji@9
|
105 ところで、この関数こんなに簡単だろう? そろそろ自分で書いたらどう?
|
yuuji@9
|
106 "
|
yuuji@9
|
107 "OK! This is the definition of function you want to make! Add
|
yuuji@9
|
108 this description to your ~/.emacs or so. Use this buffer(*Guide*)
|
yuuji@9
|
109 for testing of this function please.
|
yuuji@9
|
110 But you can see this function quite easy, can't you? You had better
|
yuuji@9
|
111 write your most favorite add-in function yourself!
|
yuuji@9
|
112 "
|
yuuji@9
|
113 )
|
yuuji@9
|
114
|
yuuji@9
|
115 (YaTeX-setq YaTeX-generate-nomatch-message
|
yuuji@9
|
116 "こらこら、そんな文字列どこにもねーぞ!!"
|
yuuji@9
|
117 "No such string in additional string."
|
yuuji@9
|
118 )
|
yuuji@9
|
119 (YaTeX-setq YaTeX-generate-buffer
|
yuuji@9
|
120 "*付加関数生成バッファ*"
|
yuuji@9
|
121 "*Generate-add-in-function*"
|
yuuji@9
|
122 )
|
yuuji@9
|
123
|
yuuji@9
|
124 (YaTeX-setq YaTeX-generate-message-buffer
|
yuuji@9
|
125 "*ご案内*"
|
yuuji@9
|
126 "*Guide*"
|
yuuji@9
|
127 )
|
yuuji@9
|
128
|
yuuji@9
|
129 (YaTeX-setq YaTeX-generate-bug-message
|
yuuji@9
|
130 "ごめ〜ん!! ちょっと、このアドイン関数つくるの失敗しちゃったみたい!!
|
yuuji@9
|
131 作者まで連絡してくださ〜〜〜い!"
|
yuuji@9
|
132 "Sorry I failed to make add-in function for you...
|
yuuji@9
|
133 Send bug report to me."
|
yuuji@9
|
134 )
|
yuuji@9
|
135
|
yuuji@9
|
136 (YaTeX-setq YaTeX-generate-narrow-message
|
yuuji@9
|
137 "画面がせますぎるような気がします。"
|
yuuji@9
|
138 "Too narrow screen height."
|
yuuji@9
|
139 )
|
yuuji@9
|
140
|
yuuji@9
|
141 (defvar YaTeX-generate-message-height
|
yuuji@9
|
142 10 "Window height of YaTeX-generate-message-buffer")
|
yuuji@9
|
143
|
yuuji@52
|
144 ;; Do you need learning for generated function?
|
yuuji@70
|
145 ;; If you need, please tell me (yuuji@yatex.org)
|
yuuji@52
|
146 ;;(defvar YaTeX-generate-variables-for-learning nil)
|
yuuji@52
|
147 ;;(defvar YaTeX-generate-current-completion-table nil)
|
yuuji@52
|
148
|
yuuji@9
|
149 ;;;
|
yuuji@9
|
150 ;Generate mode.
|
yuuji@9
|
151 ;;;
|
yuuji@9
|
152 (defun YaTeX-generate ()
|
yuuji@9
|
153 "Genarate YaTeX add-in function with enquiry."
|
yuuji@9
|
154 (interactive)
|
yuuji@70
|
155 (if (< (YaTeX-screen-height) (+ YaTeX-generate-message-height 10))
|
yuuji@9
|
156 (error YaTeX-generate-narrow-message))
|
yuuji@9
|
157 (put 'YaTeX-generate 'disabled t)
|
yuuji@9
|
158 (save-window-excursion
|
yuuji@9
|
159 (unwind-protect
|
yuuji@9
|
160 (let (input output (i 0) (beg 0) end add-in map map1 si str slist
|
yuuji@9
|
161 (from (make-marker)) (to (make-marker)))
|
yuuji@9
|
162 (delete-other-windows)
|
yuuji@9
|
163 (switch-to-buffer YaTeX-generate-message-buffer)
|
yuuji@9
|
164 (yatex-mode)
|
yuuji@9
|
165 (erase-buffer)
|
yuuji@9
|
166 (insert YaTeX-generate-initial-message)
|
yuuji@9
|
167 (read-string
|
yuuji@9
|
168 (if YaTeX-japan "リターンキーを押して下さい." "Press RETURN."))
|
yuuji@9
|
169 (erase-buffer)
|
yuuji@9
|
170 (insert YaTeX-generate-start-message)
|
yuuji@9
|
171 (pop-to-buffer (get-buffer-create YaTeX-generate-buffer))
|
yuuji@9
|
172 (enlarge-window (- (window-height) YaTeX-generate-message-height 1))
|
yuuji@9
|
173 (erase-buffer)
|
yuuji@9
|
174 (yatex-mode)
|
yuuji@9
|
175 (use-local-map (setq map (copy-keymap YaTeX-mode-map)))
|
yuuji@9
|
176 (define-key (current-local-map) "\n" 'exit-recursive-edit)
|
yuuji@9
|
177 (define-key (current-local-map) "\r" 'exit-recursive-edit)
|
yuuji@9
|
178 (define-key (current-local-map) "\C-g" 'abort-recursive-edit)
|
yuuji@9
|
179 (setq map1 (copy-keymap map))
|
yuuji@9
|
180 (YaTeX-suppress-sparse-keymap map)
|
yuuji@9
|
181 ;;First get input form.
|
yuuji@9
|
182 (recursive-edit)
|
yuuji@72
|
183 (setq input (YaTeX-minibuffer-string)
|
yuuji@9
|
184 end (1- (length input)))
|
yuuji@9
|
185 (if (string= "" input) (error YaTeX-generate-abort-message))
|
yuuji@9
|
186 (YaTeX-generate-move-to-add-in-position)
|
yuuji@9
|
187 (set-marker from (1- (point))) ;;Can't write before `from'
|
yuuji@9
|
188 (set-marker to (1+ (point))) ;;Can't write after `to'
|
yuuji@9
|
189 ;;Second get output form.
|
yuuji@9
|
190 (setq beg (1- (point)));;Cheat begin point!
|
yuuji@9
|
191 (YaTeX-generate-display-message YaTeX-generate-output-message)
|
yuuji@9
|
192 (use-local-map map1)
|
yuuji@9
|
193 (fset 'si (symbol-function 'self-insert-command))
|
yuuji@9
|
194 (defun self-insert-command (arg)
|
yuuji@9
|
195 (interactive "p")
|
yuuji@9
|
196 (if (or (not (equal (buffer-name) YaTeX-generate-buffer))
|
yuuji@9
|
197 (and (> (point) (marker-position from))
|
yuuji@9
|
198 (< (point) (marker-position to))))
|
yuuji@9
|
199 (insert (this-command-keys)) (ding)))
|
yuuji@9
|
200 (unwind-protect
|
yuuji@9
|
201 (recursive-edit)
|
yuuji@9
|
202 (fset 'self-insert-command (symbol-function 'si)))
|
yuuji@72
|
203 (setq output (YaTeX-minibuffer-string))
|
yuuji@9
|
204 (cond ((string= "" output) (error YaTeX-generate-abort-message))
|
yuuji@9
|
205 ((string= input output) (error YaTeX-generate-same-message))
|
yuuji@9
|
206 ((< (length output) (length input))
|
yuuji@9
|
207 (error YaTeX-generate-invalid-message)))
|
yuuji@9
|
208 ;;(while (and (< beg end) (= (aref input beg) (aref output i)))
|
yuuji@9
|
209 ;; (setq beg (1+ beg) i (1+ i))) ;;for universal use.
|
yuuji@9
|
210 (setq i (1- (length output)))
|
yuuji@9
|
211 (while (and (>= end beg) (= (aref output i) (aref input end)))
|
yuuji@9
|
212 (setq end (1- end) i (1- i)))
|
yuuji@9
|
213 (setq add-in (substring output beg
|
yuuji@9
|
214 (if (= i (1- (length output))) nil (1+ i))))
|
yuuji@9
|
215 (erase-buffer)
|
yuuji@9
|
216 (insert add-in)
|
yuuji@9
|
217 (if (not (y-or-n-p YaTeX-generate-confirm-message))
|
yuuji@9
|
218 (error YaTeX-generate-idontknow-message))
|
yuuji@9
|
219 ;;Extract arguments.
|
yuuji@9
|
220 (YaTeX-generate-display-message YaTeX-generate-put-arg-message)
|
yuuji@9
|
221 (setq i 1)
|
yuuji@9
|
222 (while (not (string=
|
yuuji@9
|
223 "" (setq str (read-string (format "Arg %d: " i)))))
|
yuuji@9
|
224 (if (not (string-match (regexp-quote str) add-in))
|
yuuji@9
|
225 (progn
|
yuuji@9
|
226 (ding)
|
yuuji@9
|
227 (YaTeX-generate-display-message
|
yuuji@9
|
228 YaTeX-generate-nomatch-message -1))
|
yuuji@9
|
229 (setq slist (append slist (list (list str))) i (1+ i)))
|
yuuji@9
|
230 );input all of arguments.
|
yuuji@9
|
231 ;;Compare with output string.
|
yuuji@9
|
232 (set-buffer YaTeX-generate-buffer) ;;for safety
|
yuuji@9
|
233 (emacs-lisp-mode)
|
yuuji@9
|
234 (if (> i 1)
|
yuuji@9
|
235 (YaTeX-generate-parse-add-in slist add-in)
|
yuuji@9
|
236 (erase-buffer)
|
yuuji@9
|
237 (insert "(defun " (YaTeX-generate-function-name) " ()\n")
|
yuuji@9
|
238 (insert "\"" (YaTeX-generate-lisp-quote add-in) "\")\n")
|
yuuji@9
|
239 (indent-region (point-min) (point-max) nil)
|
yuuji@9
|
240 (message (if YaTeX-japan
|
yuuji@9
|
241 "このくらいの関数手で書け!!"
|
yuuji@9
|
242 "You don't need me to make such easy function.")))
|
yuuji@9
|
243 );let
|
yuuji@9
|
244 (put 'YaTeX-generate 'disabled nil)
|
yuuji@9
|
245 (put 'YaTeX-addin 'disabled nil)
|
yuuji@9
|
246 ))
|
yuuji@9
|
247 (YaTeX-generate-display-message YaTeX-generate-done-message)
|
yuuji@9
|
248 (switch-to-buffer YaTeX-generate-buffer)
|
yuuji@9
|
249 (condition-case error
|
yuuji@9
|
250 (eval-current-buffer)
|
yuuji@9
|
251 (error (insert YaTeX-generate-bug-message)))
|
yuuji@9
|
252 (pop-to-buffer YaTeX-generate-message-buffer)
|
yuuji@9
|
253 )
|
yuuji@9
|
254
|
yuuji@9
|
255 (defun YaTeX-generate-parse-add-in (args add-in)
|
yuuji@9
|
256 "Parse add-in string and extract argument for it.
|
yuuji@9
|
257 Variable add-in is referred in parent function."
|
yuuji@9
|
258 (let ((i 1) j (case-fold-search nil) ;i holds argument number
|
yuuji@9
|
259 (prompt (make-vector (length args) ""))
|
yuuji@9
|
260 (used (make-vector (length add-in) nil))
|
yuuji@9
|
261 func-name (string ""))
|
yuuji@9
|
262 ;;Phase 1. extract argument from add-in string.
|
yuuji@9
|
263 (mapcar
|
yuuji@9
|
264 '(lambda (arg)
|
yuuji@9
|
265 (let ((index 0) (match 0) beg end (carg (car arg)))
|
yuuji@9
|
266 (YaTeX-generate-display-message
|
yuuji@9
|
267 YaTeX-generate-read-prompt-message)
|
yuuji@9
|
268 (aset prompt (1- i)
|
yuuji@9
|
269 (read-string
|
yuuji@9
|
270 (format
|
yuuji@9
|
271 (if YaTeX-japan "%d番目(%s)を読む時?: "
|
yuuji@9
|
272 "When reading argument #%d(%s)?: ") i (car arg))))
|
yuuji@9
|
273 (while (string-match (regexp-quote carg) (substring add-in index))
|
yuuji@9
|
274 (setq beg (+ index (match-beginning 0))
|
yuuji@9
|
275 end (+ index (match-end 0)))
|
yuuji@9
|
276 (if (aref used beg) nil
|
yuuji@9
|
277 (setq match (1+ match))
|
yuuji@9
|
278 (cond
|
yuuji@9
|
279 ((= match 1)
|
yuuji@9
|
280 ;;(setq arg (append arg (list (list beg end))))
|
yuuji@9
|
281 (YaTeX-generate-register-match))
|
yuuji@9
|
282 ((YaTeX-generate-ask-match-position)
|
yuuji@9
|
283 (YaTeX-generate-register-match))))
|
yuuji@9
|
284 (setq index end))
|
yuuji@9
|
285 (setq i (1+ i))))
|
yuuji@9
|
286 args)
|
yuuji@9
|
287 ;;Phase 2. Generate function!!
|
yuuji@9
|
288 (setq i 0)
|
yuuji@9
|
289 (setq func-name (YaTeX-generate-function-name))
|
yuuji@9
|
290 (while (< i (length add-in))
|
yuuji@9
|
291 (setq beg i j (aref used i))
|
yuuji@9
|
292 (while (and (< i (length add-in)) (equal j (aref used i)))
|
yuuji@9
|
293 (setq i (1+ i)))
|
yuuji@9
|
294 (if j ;If it is argument.
|
yuuji@9
|
295 (setq string (concat string (format " arg%d" j)))
|
yuuji@9
|
296 (setq string
|
yuuji@9
|
297 (concat string " \""
|
yuuji@9
|
298 (YaTeX-generate-quote-quote (substring add-in beg i))
|
yuuji@9
|
299 "\""))
|
yuuji@9
|
300 ))
|
yuuji@9
|
301 (erase-buffer)
|
yuuji@9
|
302 (setq i 1)
|
yuuji@9
|
303 (insert
|
yuuji@9
|
304 "(defun " func-name " ()\n"
|
yuuji@9
|
305 " (let (")
|
yuuji@9
|
306 (mapcar
|
yuuji@9
|
307 '(lambda (arg)
|
yuuji@9
|
308 (insert (format "(arg%d (read-string \"%s: \"))\n"
|
yuuji@9
|
309 i (aref prompt (1- i))))
|
yuuji@9
|
310 (setq i (1+ i)))
|
yuuji@9
|
311 args)
|
yuuji@9
|
312 (delete-region (point) (progn (forward-line -1) (end-of-line) (point)))
|
yuuji@9
|
313 (insert ")\n(concat " (YaTeX-generate-lisp-quote string)
|
yuuji@9
|
314 ")))\n")
|
yuuji@9
|
315 (indent-region (point-min) (point) nil)
|
yuuji@9
|
316 used)
|
yuuji@9
|
317 )
|
yuuji@9
|
318
|
yuuji@9
|
319 (defun YaTeX-generate-ask-match-position ()
|
yuuji@9
|
320 "Ask user whether match-position is in his expectation,
|
yuuji@9
|
321 Referencing variables in parent function YaTeX-generate-parse-add-in."
|
yuuji@9
|
322 (pop-to-buffer YaTeX-generate-message-buffer)
|
yuuji@9
|
323 (goto-char (point-max))
|
yuuji@9
|
324 (insert "\n\n"
|
yuuji@9
|
325 (format (if YaTeX-japan "%d 番目の引数 %s って"
|
yuuji@9
|
326 "Is argument #%d's value `%s' also corresponding to")
|
yuuji@9
|
327 i carg) "\n" add-in "\n")
|
yuuji@9
|
328 (indent-to-column beg)
|
yuuji@9
|
329 (let ((c beg))
|
yuuji@9
|
330 (while (< c end) (insert "^") (setq c (1+ c))))
|
yuuji@9
|
331 (insert "\n" (if YaTeX-japan "ここにも対応してるの?"
|
yuuji@9
|
332 "this underlined part too?"))
|
yuuji@9
|
333 (other-window -1)
|
yuuji@9
|
334 (y-or-n-p (if YaTeX-japan "下線部はあってますか" "Is underline right"))
|
yuuji@9
|
335 )
|
yuuji@9
|
336
|
yuuji@9
|
337 (defun YaTeX-generate-register-match ()
|
yuuji@9
|
338 (nconc arg (list (list beg end)))
|
yuuji@9
|
339 (let ((x beg))
|
yuuji@9
|
340 (while (< x end) (aset used x i)(setq x (1+ x))))
|
yuuji@9
|
341 )
|
yuuji@9
|
342
|
yuuji@9
|
343 (defun YaTeX-generate-display-message (mes &optional bottom)
|
yuuji@9
|
344 "Display message to generation buffer."
|
yuuji@9
|
345 (pop-to-buffer YaTeX-generate-message-buffer)
|
yuuji@9
|
346 (goto-char (point-max))
|
yuuji@9
|
347 (insert "\n\n")
|
yuuji@9
|
348 (if bottom (recenter (1- bottom)) (recenter 0))
|
yuuji@9
|
349 (insert mes)
|
yuuji@9
|
350 (other-window -1)
|
yuuji@9
|
351 )
|
yuuji@9
|
352
|
yuuji@9
|
353 (defun YaTeX-generate-move-to-add-in-position ()
|
yuuji@9
|
354 "Move cursor where add-in function should insert string."
|
yuuji@9
|
355 (cond
|
yuuji@9
|
356 ((eq YaTeX-current-completion-type 'begin)
|
yuuji@9
|
357 (goto-char (point-min))
|
yuuji@9
|
358 (skip-chars-forward "^{")
|
yuuji@72
|
359 (setq YaTeX-env-name
|
yuuji@9
|
360 (buffer-substring (1+ (point))
|
yuuji@9
|
361 (progn (skip-chars-forward "^}") (point))))
|
yuuji@9
|
362 (forward-char 1))
|
yuuji@9
|
363 ((eq YaTeX-current-completion-type 'section)
|
yuuji@9
|
364 (goto-char (point-min))
|
yuuji@9
|
365 (skip-chars-forward "^{"))
|
yuuji@9
|
366 ((eq YaTeX-current-completion-type 'maketitle)
|
yuuji@9
|
367 (goto-char (point-max))
|
yuuji@9
|
368 (if (= (preceding-char) ? )
|
yuuji@9
|
369 (forward-char -1)))
|
yuuji@9
|
370 )
|
yuuji@9
|
371 )
|
yuuji@9
|
372
|
yuuji@9
|
373 (defun YaTeX-generate-function-name ()
|
yuuji@9
|
374 (concat
|
yuuji@9
|
375 "YaTeX:"
|
yuuji@9
|
376 (cond
|
yuuji@72
|
377 ((eq YaTeX-current-completion-type 'begin) YaTeX-env-name)
|
yuuji@72
|
378 ((eq YaTeX-current-completion-type 'section) YaTeX-section-name)
|
yuuji@72
|
379 ((eq YaTeX-current-completion-type 'maketitle) YaTeX-single-command)))
|
yuuji@9
|
380 )
|
yuuji@9
|
381
|
yuuji@9
|
382 (defun YaTeX-generate-lisp-quote (str)
|
yuuji@9
|
383 (let ((len (length str))(i 0) (quote ""))
|
yuuji@9
|
384 (while (< i len)
|
yuuji@9
|
385 (if (= (aref str i) ?\\)
|
yuuji@9
|
386 (setq quote (concat quote "\\")))
|
yuuji@9
|
387 (if (= (aref str i) 127)
|
yuuji@9
|
388 (setq quote (concat quote "\""))
|
yuuji@9
|
389 (setq quote (concat quote (substring str i (1+ i)))))
|
yuuji@9
|
390 (setq i (1+ i)))
|
yuuji@9
|
391 quote)
|
yuuji@9
|
392 )
|
yuuji@9
|
393
|
yuuji@9
|
394 (defun YaTeX-generate-quote-quote (str)
|
yuuji@9
|
395 (let ((len (length str))(i 0) (quote ""))
|
yuuji@9
|
396 (while (< i len)
|
yuuji@9
|
397 (if (= (aref str i) ?\")
|
yuuji@9
|
398 (setq quote (concat quote (char-to-string 127))))
|
yuuji@9
|
399 (setq quote (concat quote (substring str i (1+ i))))
|
yuuji@9
|
400 (setq i (1+ i)))
|
yuuji@9
|
401 quote)
|
yuuji@9
|
402 )
|
yuuji@9
|
403
|
yuuji@9
|
404 (defun YaTeX-suppress-sparse-keymap (map)
|
yuuji@9
|
405 (let ((i ? ))
|
yuuji@9
|
406 (while (< i 127)
|
yuuji@9
|
407 (define-key map (char-to-string i) 'undefined)
|
yuuji@9
|
408 (setq i (1+ i))))
|
yuuji@9
|
409 )
|
yuuji@23
|
410
|
yuuji@23
|
411 ;;;
|
yuuji@23
|
412 ;; Auto-generate Function for Lispers.
|
yuuji@23
|
413 ;;;
|
yuuji@23
|
414 (defun YaTeX-generate-read-completion-type (nth)
|
yuuji@23
|
415 (message
|
yuuji@23
|
416 "Read type(%d): (S)tring (C)omplete (F)ile ([)option (P)osition co(O)rd. (q)uit" nth)
|
yuuji@23
|
417 (let ((c (read-char)))
|
yuuji@23
|
418 (cond
|
yuuji@23
|
419 ((= c ?s) 'string)
|
yuuji@23
|
420 ((= c ?c) 'completion)
|
yuuji@23
|
421 ((= c ?f) 'file)
|
yuuji@23
|
422 ((= c ?\[) 'option)
|
yuuji@23
|
423 ((= c ?p) 'oneof)
|
yuuji@23
|
424 ((= c ?o) 'coord)
|
yuuji@23
|
425 ;;((= c ?m) 'macro)
|
yuuji@23
|
426 (t 'quit)))
|
yuuji@23
|
427 )
|
yuuji@23
|
428 (defun YaTeX-generate-read-completion-table ()
|
yuuji@23
|
429 (let ((i 1) cand (cands "(") (cb (current-buffer))
|
yuuji@23
|
430 (buf (get-buffer-create " *Candidates*")))
|
yuuji@23
|
431 (save-window-excursion
|
yuuji@23
|
432 (save-excursion
|
yuuji@23
|
433 (YaTeX-showup-buffer buf nil)
|
yuuji@23
|
434 (set-buffer buf)
|
yuuji@23
|
435 (erase-buffer)
|
yuuji@23
|
436 (while (string<
|
yuuji@23
|
437 ""
|
yuuji@23
|
438 (setq cand (read-string (format "Item[%d](RET to exit): " i))))
|
yuuji@46
|
439 (setq cands (concat cands (format "(\"%s\")\n" cand))
|
yuuji@23
|
440 i (1+ i))
|
yuuji@23
|
441 (insert cand "\n"))
|
yuuji@23
|
442 (kill-buffer buf)))
|
yuuji@23
|
443 ;;(set-buffer cb)
|
yuuji@52
|
444 (setq YaTeX-generate-current-completion-table (concat cands ")")))
|
yuuji@23
|
445 )
|
yuuji@23
|
446 (defun YaTeX-generate-corresponding-paren (left)
|
yuuji@23
|
447 (cond
|
yuuji@23
|
448 ((equal left "{") "}")
|
yuuji@23
|
449 ((equal left "[") "]")
|
yuuji@23
|
450 ((equal left "(") ")")
|
yuuji@23
|
451 ((equal left "<") ">")
|
yuuji@59
|
452 ((equal left "\\begin{") "}")
|
yuuji@23
|
453 (t left))
|
yuuji@23
|
454 )
|
yuuji@23
|
455 (defun YaTeX-generate-create-read-string (&optional nth)
|
yuuji@23
|
456 (concat
|
yuuji@46
|
457 "(read-string \""
|
yuuji@23
|
458 (read-string (if nth (format "Prompt for argument#%d: " nth) "Prompt: "))
|
yuuji@46
|
459 ": \"\n"
|
yuuji@46
|
460 "\"" (read-string "Default: ") "\""
|
yuuji@23
|
461 ")\n")
|
yuuji@23
|
462 )
|
yuuji@23
|
463 (defun YaTeX-generate-create-completing-read (&optional nth)
|
yuuji@52
|
464 (prog1
|
yuuji@52
|
465 (concat
|
yuuji@52
|
466 "(completing-read \""
|
yuuji@52
|
467 (read-string
|
yuuji@52
|
468 (if nth (format "Prompt for argument#%d: " nth) "Prompt: "))
|
yuuji@52
|
469 ": \"\n"
|
yuuji@52
|
470 (format "'%s\n" (YaTeX-generate-read-completion-table))
|
yuuji@52
|
471 "nil "
|
yuuji@52
|
472 (format "%s)" (y-or-n-p "Require match? ")))
|
yuuji@52
|
473 (if nil ;;;(y-or-n-p "Do you need learning for this completion?")
|
yuuji@52
|
474 (setq YaTeX-generate-variables-for-learning
|
yuuji@52
|
475 (cons
|
yuuji@52
|
476 (cons (format "YaTeX-%s-%d" command (or nth 0))
|
yuuji@52
|
477 YaTeX-generate-current-completion-table)
|
yuuji@52
|
478 YaTeX-generate-variables-for-learning))))
|
yuuji@23
|
479 )
|
yuuji@23
|
480 (defun YaTeX-generate-create-read-file-name (&optional nth)
|
yuuji@23
|
481 (concat
|
yuuji@46
|
482 "(read-file-name \""
|
yuuji@23
|
483 (read-string (if nth (format "Prompt for argument#%d: " nth) "Prompt: "))
|
yuuji@52
|
484 ": \" "" \"\" t \"\")\n")
|
yuuji@23
|
485 )
|
yuuji@23
|
486 (defun YaTeX-generate-create-read-oneof (&optional nth readpos)
|
yuuji@23
|
487 (concat
|
yuuji@23
|
488 (if readpos
|
yuuji@46
|
489 "(YaTeX:read-position \""
|
yuuji@46
|
490 "(YaTeX:read-oneof \"")
|
yuuji@46
|
491 (read-string "Acceptable characters: " "lcr") "\")\n")
|
yuuji@23
|
492 )
|
yuuji@23
|
493 (defun YaTeX-generate-option-type (command)
|
yuuji@23
|
494 (let ((func (format "YaTeX:%s" command)) leftp
|
yuuji@23
|
495 (buf (get-buffer-create YaTeX-generate-buffer)) type (n 1))
|
yuuji@23
|
496 (set-buffer buf)
|
yuuji@23
|
497 (erase-buffer)
|
yuuji@23
|
498 (insert "(defun " func " ()\n (concat\n")
|
yuuji@23
|
499 (catch 'done
|
yuuji@23
|
500 (while t
|
yuuji@23
|
501 (setq type (YaTeX-generate-read-completion-type n))
|
yuuji@23
|
502 (insert
|
yuuji@23
|
503 (cond
|
yuuji@23
|
504 ;;Read string
|
yuuji@23
|
505 ((eq type 'string)
|
yuuji@52
|
506 (concat "\"" (setq leftp (read-string "Left parenthesis: " "("))
|
yuuji@52
|
507 "\"\n"
|
yuuji@23
|
508 (YaTeX-generate-create-read-string)
|
yuuji@52
|
509 "\"" (YaTeX-generate-corresponding-paren leftp) "\"")
|
yuuji@52
|
510 )
|
yuuji@23
|
511 ;;Completing-read
|
yuuji@23
|
512 ((eq type 'completion)
|
yuuji@52
|
513 (concat "\"" (setq leftp (read-string "Left parenthesis: " "{"))
|
yuuji@52
|
514 "\"\n"
|
yuuji@23
|
515 (YaTeX-generate-create-completing-read)
|
yuuji@52
|
516 "\"" (YaTeX-generate-corresponding-paren leftp) "\"")
|
yuuji@23
|
517 )
|
yuuji@23
|
518 ((eq type 'file)
|
yuuji@52
|
519 (concat "\"" (setq leftp (read-string "Left parenthesis: " "("))
|
yuuji@52
|
520 "\"\n"
|
yuuji@23
|
521 (YaTeX-generate-create-read-file-name)
|
yuuji@52
|
522 "\"" (YaTeX-generate-corresponding-paren leftp) "\"")
|
yuuji@23
|
523 )
|
yuuji@23
|
524 ((eq type 'oneof)
|
yuuji@23
|
525 (YaTeX-generate-create-read-oneof nil t)
|
yuuji@23
|
526 )
|
yuuji@23
|
527 ((eq type 'option)
|
yuuji@46
|
528 (concat "(let ((op (read-string \""
|
yuuji@23
|
529 (read-string "Prompt: ")
|
yuuji@46
|
530 ": \")))\n"
|
yuuji@46
|
531 "(if (string< \"\" op)\n"
|
yuuji@46
|
532 " (concat \"[\" op \"]\")\n"
|
yuuji@46
|
533 " \"\"))\n")
|
yuuji@23
|
534 )
|
yuuji@23
|
535 ((eq type 'coord)
|
yuuji@46
|
536 (concat "(YaTeX:read-coordinates \""
|
yuuji@23
|
537 (read-string "Prompt for coordinates: ")
|
yuuji@46
|
538 ": \")\n")
|
yuuji@23
|
539 )
|
yuuji@23
|
540 ((eq type 'macro)
|
yuuji@23
|
541 (error "not yet supported")
|
yuuji@23
|
542 )
|
yuuji@23
|
543 (t (throw 'done t))))
|
yuuji@23
|
544 (setq n (1+ n))))
|
yuuji@23
|
545 (insert "))\n") ;close defun
|
yuuji@23
|
546 (goto-char (point-min))
|
yuuji@23
|
547 (while (not (eobp)) (lisp-indent-line) (forward-line 1))
|
yuuji@23
|
548 (eval-current-buffer)
|
yuuji@23
|
549 buf)
|
yuuji@23
|
550 )
|
yuuji@23
|
551 (defun YaTeX-generate-argument-type (command argc)
|
yuuji@23
|
552 "Create an argument-type add-in function."
|
yuuji@23
|
553 (interactive)
|
yuuji@23
|
554 (let ((func (format "YaTeX::%s" command)) (argp 1)
|
yuuji@23
|
555 (cb (current-buffer))
|
yuuji@23
|
556 (buf (get-buffer-create YaTeX-generate-buffer)))
|
yuuji@23
|
557 (set-buffer buf)
|
yuuji@23
|
558 (erase-buffer)
|
yuuji@23
|
559 (insert "(defun " func " (&optional argp)\n(cond\n")
|
yuuji@23
|
560 (while (<= argp argc)
|
yuuji@23
|
561 (insert (format "((equal argp %d)\n" argp))
|
yuuji@23
|
562 (setq type (YaTeX-generate-read-completion-type argp))
|
yuuji@23
|
563 (insert
|
yuuji@23
|
564 (cond
|
yuuji@23
|
565 ((eq type 'string)
|
yuuji@23
|
566 (concat (YaTeX-generate-create-read-string argp)))
|
yuuji@23
|
567 ((eq type 'completion)
|
yuuji@23
|
568 (concat (YaTeX-generate-create-completing-read argp)))
|
yuuji@23
|
569 ((eq type 'oneof)
|
yuuji@23
|
570 (YaTeX-generate-create-read-oneof))
|
yuuji@23
|
571 ((eq type 'file)
|
yuuji@23
|
572 (concat (YaTeX-generate-create-read-file-name argp)))
|
yuuji@23
|
573 (t ""))
|
yuuji@23
|
574 ")\n")
|
yuuji@23
|
575 (setq argp (1+ argp)))
|
yuuji@23
|
576 (insert "))\n")
|
yuuji@23
|
577 (goto-char (point-min))
|
yuuji@23
|
578 (while (not (eobp)) (lisp-indent-line) (forward-line 1))
|
yuuji@23
|
579 (eval-current-buffer)
|
yuuji@23
|
580 (set-buffer cb)
|
yuuji@23
|
581 (YaTeX-update-table
|
yuuji@23
|
582 (if (> argc 1) (list command argc) (list command))
|
yuuji@23
|
583 'section-table 'user-section-table 'tmp-section-table)
|
yuuji@23
|
584 buf)
|
yuuji@23
|
585 )
|
yuuji@23
|
586 (defun YaTeX-generate-simple (&optional command)
|
yuuji@23
|
587 "Simple but requiring some elisp knowledge add-in generator."
|
yuuji@23
|
588 (interactive)
|
yuuji@52
|
589 (setq YaTeX-generate-variables-for-learning nil)
|
yuuji@23
|
590 (or command
|
yuuji@23
|
591 (setq command
|
yuuji@23
|
592 (completing-read
|
yuuji@72
|
593 (format
|
yuuji@72
|
594 "Making add-in function for (default %s): " YaTeX-section-name)
|
yuuji@23
|
595 (append
|
yuuji@23
|
596 section-table user-section-table tmp-section-table
|
yuuji@23
|
597 env-table user-env-table tmp-env-table
|
yuuji@23
|
598 singlecmd-table user-singlecmd-table tmp-singlecmd-table)
|
yuuji@23
|
599 nil nil)
|
yuuji@72
|
600 command (if (string= "" command) YaTeX-section-name command)))
|
yuuji@49
|
601 (message
|
yuuji@49
|
602 (cond
|
yuuji@49
|
603 (YaTeX-japan "(o)追加型? (a)引数型? (yatexadd.docを参照のこと) :")
|
yuuji@49
|
604 (t "(O)ption? (A)rgument?")))
|
yuuji@23
|
605 (YaTeX-showup-buffer
|
yuuji@23
|
606 (if (= (read-char) ?o)
|
yuuji@23
|
607 (YaTeX-generate-option-type command)
|
yuuji@23
|
608 (YaTeX-generate-argument-type
|
yuuji@23
|
609 command
|
yuuji@23
|
610 (string-to-int (read-string "How many arguments?: ")))) nil)
|
yuuji@23
|
611 )
|
yuuji@70
|
612 (provide 'yatexgen)
|