yatex

annotate yatexgen.el @ 52:5d94deabb9f9

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