yatex

annotate yatexgen.el @ 72:0aaebd07dad0

Support font-lock on XEmacs-21, Emacs-20, Emacs-21. Support Emacs-21.
author yuuji
date Mon, 25 Dec 2000 10:19:28 +0000
parents 44e3a5e1e883
children 0734be649cb8
rev   line source
yuuji@9 1 ;;; -*- Emacs-Lisp -*-
yuuji@23 2 ;;; YaTeX add-in function generator.
yuuji@52 3 ;;; yatexgen.el rev.5
yuuji@72 4 ;;; (c )1991-1995,1999,2000 by HIROSE Yuuji.[yuuji@yatex.org]
yuuji@72 5 ;;; Last modified Mon Dec 25 19:17:30 2000 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)