yatex

diff yatexgen.el @ 9:7becca042f80

Initial revision.
author yuuji
date Tue, 04 May 1993 13:01:29 +0000
parents
children 390df0e505da
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/yatexgen.el	Tue May 04 13:01:29 1993 +0000
     1.3 @@ -0,0 +1,405 @@
     1.4 +;;; -*- Emacs-Lisp -*-
     1.5 +;;; Generate add-in functions for YaTeX.
     1.6 +;;; yatexgen.el rev.1(beta2)
     1.7 +;;; (c)1991-1993 by HIROSE Yuuji.[yuuji@ae.keio.ac.jp]
     1.8 +;;; Last modified Tue May  4 21:51:23 1993 on figaro
     1.9 +;;; $Id$
    1.10 +
    1.11 +(require 'yatex)
    1.12 +(provide 'yatexgen)
    1.13 +
    1.14 +(defmacro YaTeX-setq (var japanese english)
    1.15 +  (list 'setq var
    1.16 +	(if YaTeX-japan japanese english))
    1.17 +)
    1.18 +
    1.19 +(put 'YaTeX-setq 'lisp-indent-hook 1)
    1.20 +
    1.21 +(YaTeX-setq YaTeX-generate-initial-message
    1.22 +  "             自動生成モードへようこそ!!
    1.23 +
    1.24 +初めてやる人はこのバッファの例にしたがって指示通りにやって練習してね。
    1.25 +本番の時もこのバッファに出るメッセージを *よく読んで* 操作しないとう
    1.26 +まく関数が作れないよ!!
    1.27 +
    1.28 +  ではリターンキーを押して下さい。"
    1.29 +  "             Welcome to auto-generation mode!!
    1.30 +
    1.31 +If this is your first trial, exercise this according to example and
    1.32 +following my messages.  Then, at making actual function, operate
    1.33 +reading my messages *carefully*, or you'll fail to generate appropriate
    1.34 +function.
    1.35 +
    1.36 +  Hit return key!"
    1.37 +)
    1.38 +
    1.39 +(YaTeX-setq YaTeX-generate-start-message
    1.40 +  "さぁはじめるよ.\n1.登録したい補完をやってみて.
    1.41 +たとえば section 型補完の \\documentstyle だったら \\documentstyle{}
    1.42 +だけをいれてみてね. ちゃんと『〜型補完』を使わないとダメよ!。
    1.43 +で、おわったらりたーん!!"
    1.44 +  "Let's begin completion for which you want to make add-in function.
    1.45 +If you want to make add-in function for \\documentstyle input only
    1.46 +`\\documentstyle{}' *with* completion of yatex-mode.
    1.47 +If you finish this, please press RET."
    1.48 +)
    1.49 +
    1.50 +(YaTeX-setq YaTeX-generate-abort-message
    1.51 +  "やめた、やめた〜いめんどくせ〜"
    1.52 +  "Aborted."
    1.53 +)
    1.54 +
    1.55 +(YaTeX-setq YaTeX-generate-same-message
    1.56 +  "それじゃ、なにも変わってねぇだろーが! やめた。"
    1.57 +  "I found no difference between them.  So I'm quitting."
    1.58 +)
    1.59 +
    1.60 +(YaTeX-setq YaTeX-generate-invalid-message
    1.61 +  "それは、ちと無理というものじゃ."
    1.62 +  "It's impossible."
    1.63 +)
    1.64 +
    1.65 +(YaTeX-setq YaTeX-generate-idontknow-message
    1.66 +  "う〜ん、難しくてよくわからないなぁ。ばかでごめんねェ〜"
    1.67 +  "Sorry I can't tell your adding method."
    1.68 +)
    1.69 +
    1.70 +(YaTeX-setq YaTeX-generate-confirm-message
    1.71 +  "ということは、付け足したい部分はこれでいいのね"
    1.72 +  "Is it additional string of add-in function?"
    1.73 +)
    1.74 +
    1.75 +(YaTeX-setq YaTeX-generate-output-message
    1.76 +  "2.じゃ、それにくっつけたいものを *カーソルの位置に* 足してみて. 
    1.77 +さっきの \\documentstyle{} の例だと \\documentstyle[12pt]{} とかにするの。
    1.78 +しつこいようだけど、今の位置からカーソル動かしちゃダメよ!!
    1.79 +で、またおわったらりたーん!!"
    1.80 +  "2.Then input additional string *at CURSOR POSITION*
    1.81 +According to last example \\documentstyle{},
    1.82 +modify it \\documentstyle[12pt]{}.  RET to finish."
    1.83 +)
    1.84 +
    1.85 +(YaTeX-setq YaTeX-generate-put-arg-message
    1.86 +  "3.このうち、キーボードから読み込んで欲しい文字列を順に入れて。
    1.87 +さっきの \\documentstyle[12pt]{} だったら、付加する文字は[12pt]だけど
    1.88 +手で入れたいのは 12pt の部分だけですね。
    1.89 +で、全部入れ終ったら、りたーんだけうってね!!"
    1.90 +  "3.In this string, extract string which you want to input from key
    1.91 +board with quiry afterwards.  For example, though additional string is
    1.92 +\\documentstyle[12pt]{}, but you want enter only `12pt' by hand.
    1.93 +RET to finish!"
    1.94 +)
    1.95 +
    1.96 +(YaTeX-setq YaTeX-generate-read-prompt-message
    1.97 +  "4.では、あとでこれらの文字列を読み込む時に、どういうプロンプトを
    1.98 +出したいですか? 順に入れて下さい。面倒なら単にリターンを打ってね。
    1.99 +さっきの 12pt の部分だったら、『サイズは』とかがおすすめ。"
   1.100 +  "4.When you use this add-in function afterwards, what message
   1.101 +do you like to be prompted with to enter these values.  In last
   1.102 +example `12pt', typical prompt string may be `Size?: '."
   1.103 +)
   1.104 +
   1.105 +(YaTeX-setq YaTeX-generate-done-message
   1.106 +  "よし! これが、君の作りたかった関数だ。~/.emacs にでも入れてせいぜい
   1.107 +楽してくれ。このバッファ(*ご案内*)を yatex-mode にしておくから
   1.108 +できた関数が本当にお望みの動作をするか確かめてみるといいかもね。
   1.109 +  ところで、この関数こんなに簡単だろう? そろそろ自分で書いたらどう?
   1.110 +"
   1.111 +  "OK! This is the definition of function you want to make!  Add
   1.112 +this description to your ~/.emacs or so.  Use this buffer(*Guide*)
   1.113 +for testing of this function please.
   1.114 +  But you can see this function quite easy, can't you? You had better
   1.115 +write your most favorite add-in function yourself!
   1.116 +"
   1.117 +)
   1.118 +
   1.119 +(YaTeX-setq YaTeX-generate-nomatch-message
   1.120 +  "こらこら、そんな文字列どこにもねーぞ!!"
   1.121 +  "No such string in additional string."
   1.122 +)
   1.123 +(YaTeX-setq YaTeX-generate-buffer
   1.124 +  "*付加関数生成バッファ*"
   1.125 +  "*Generate-add-in-function*"
   1.126 +)
   1.127 +
   1.128 +(YaTeX-setq YaTeX-generate-message-buffer
   1.129 +  "*ご案内*"
   1.130 +  "*Guide*"
   1.131 +)
   1.132 +
   1.133 +(YaTeX-setq YaTeX-generate-bug-message
   1.134 +  "ごめ〜ん!! ちょっと、このアドイン関数つくるの失敗しちゃったみたい!!
   1.135 +作者まで連絡してくださ〜〜〜い!"
   1.136 +  "Sorry I failed to make add-in function for you...
   1.137 +Send bug report to me."
   1.138 +)
   1.139 +
   1.140 +(YaTeX-setq YaTeX-generate-narrow-message
   1.141 +  "画面がせますぎるような気がします。"
   1.142 +  "Too narrow screen height."
   1.143 +)
   1.144 +
   1.145 +(defvar YaTeX-generate-message-height
   1.146 +  10 "Window height of YaTeX-generate-message-buffer")
   1.147 +
   1.148 +;;;
   1.149 +;Generate mode.
   1.150 +;;;
   1.151 +(defun YaTeX-generate ()
   1.152 +  "Genarate YaTeX add-in function with enquiry."
   1.153 +  (interactive)
   1.154 +  (if (< (screen-height) (+ YaTeX-generate-message-height 10))
   1.155 +      (error YaTeX-generate-narrow-message))
   1.156 +  (put 'YaTeX-generate 'disabled t)
   1.157 +  (save-window-excursion
   1.158 +    (unwind-protect
   1.159 +	(let (input output (i 0) (beg 0) end add-in map map1 si str slist
   1.160 +		    (from (make-marker)) (to (make-marker)))
   1.161 +	  (delete-other-windows)
   1.162 +	  (switch-to-buffer YaTeX-generate-message-buffer)
   1.163 +	  (yatex-mode)
   1.164 +	  (erase-buffer)
   1.165 +	  (insert YaTeX-generate-initial-message)
   1.166 +	  (read-string
   1.167 +	   (if YaTeX-japan "リターンキーを押して下さい." "Press RETURN."))
   1.168 +	  (erase-buffer)
   1.169 +	  (insert YaTeX-generate-start-message)
   1.170 +	  (pop-to-buffer (get-buffer-create YaTeX-generate-buffer))
   1.171 +	  (enlarge-window (- (window-height) YaTeX-generate-message-height 1))
   1.172 +	  (erase-buffer)
   1.173 +	  (yatex-mode)
   1.174 +	  (use-local-map (setq map (copy-keymap YaTeX-mode-map)))
   1.175 +	  (define-key (current-local-map) "\n" 'exit-recursive-edit)
   1.176 +	  (define-key (current-local-map) "\r" 'exit-recursive-edit)
   1.177 +	  (define-key (current-local-map) "\C-g" 'abort-recursive-edit)
   1.178 +	  (setq map1 (copy-keymap map))
   1.179 +	  (YaTeX-suppress-sparse-keymap map)
   1.180 +	  ;;First get input form.
   1.181 +	  (recursive-edit)
   1.182 +	  (setq input (buffer-string)
   1.183 +		end (1- (length input)))
   1.184 +	  (if (string= "" input) (error YaTeX-generate-abort-message))
   1.185 +	  (YaTeX-generate-move-to-add-in-position)
   1.186 +	  (set-marker from (1- (point)))  ;;Can't write before `from'
   1.187 +	  (set-marker to (1+ (point)))    ;;Can't write after `to'
   1.188 +	  ;;Second get output form.
   1.189 +	  (setq beg (1- (point)));;Cheat begin point!
   1.190 +	  (YaTeX-generate-display-message YaTeX-generate-output-message)
   1.191 +	  (use-local-map map1)
   1.192 +	  (fset 'si (symbol-function 'self-insert-command))
   1.193 +	  (defun self-insert-command (arg)
   1.194 +	    (interactive "p")
   1.195 +	    (if (or (not (equal (buffer-name) YaTeX-generate-buffer))
   1.196 +		    (and (> (point) (marker-position from))
   1.197 +			 (< (point) (marker-position to))))
   1.198 +		(insert (this-command-keys)) (ding)))
   1.199 +	  (unwind-protect
   1.200 +	      (recursive-edit)
   1.201 +	    (fset 'self-insert-command (symbol-function 'si)))
   1.202 +	  (setq output (buffer-string))
   1.203 +	  (cond ((string= "" output)	(error YaTeX-generate-abort-message))
   1.204 +		((string= input output)	(error YaTeX-generate-same-message))
   1.205 +		((< (length output) (length input))
   1.206 +		 (error YaTeX-generate-invalid-message)))
   1.207 +	  ;;(while (and (< beg end) (= (aref input beg) (aref output i)))
   1.208 +	  ;;  (setq beg (1+ beg) i (1+ i))) ;;for universal use.
   1.209 +	  (setq i (1- (length output)))
   1.210 +	  (while (and (>= end beg) (= (aref output i) (aref input end)))
   1.211 +	    (setq end (1- end) i (1- i)))
   1.212 +	  (setq add-in (substring output beg
   1.213 +				  (if (= i (1- (length output))) nil (1+ i))))
   1.214 +	  (erase-buffer)
   1.215 +	  (insert add-in)
   1.216 +	  (if (not (y-or-n-p YaTeX-generate-confirm-message))
   1.217 +	      (error YaTeX-generate-idontknow-message))
   1.218 +	  ;;Extract arguments.
   1.219 +	  (YaTeX-generate-display-message YaTeX-generate-put-arg-message)
   1.220 +	  (setq i 1)
   1.221 +	  (while (not (string=
   1.222 +		       "" (setq str (read-string (format "Arg %d: " i)))))
   1.223 +	    (if (not (string-match (regexp-quote str) add-in))
   1.224 +		(progn
   1.225 +		  (ding)
   1.226 +		  (YaTeX-generate-display-message
   1.227 +		   YaTeX-generate-nomatch-message -1))
   1.228 +	      (setq slist (append slist (list (list str))) i (1+ i)))
   1.229 +	    );input all of arguments.
   1.230 +	  ;;Compare with output string.
   1.231 +	  (set-buffer YaTeX-generate-buffer) ;;for safety
   1.232 +	  (emacs-lisp-mode)
   1.233 +	  (if (> i 1)
   1.234 +	      (YaTeX-generate-parse-add-in slist add-in)
   1.235 +	    (erase-buffer)
   1.236 +	    (insert "(defun " (YaTeX-generate-function-name) " ()\n")
   1.237 +	    (insert "\"" (YaTeX-generate-lisp-quote add-in) "\")\n")
   1.238 +	    (indent-region (point-min) (point-max) nil)
   1.239 +	    (message (if YaTeX-japan
   1.240 +			 "このくらいの関数手で書け!!"
   1.241 +		       "You don't need me to make such easy function.")))
   1.242 +	  );let
   1.243 +      (put 'YaTeX-generate 'disabled nil)
   1.244 +      (put 'YaTeX-addin 'disabled nil)
   1.245 +    ))
   1.246 +  (YaTeX-generate-display-message YaTeX-generate-done-message)
   1.247 +  (switch-to-buffer YaTeX-generate-buffer)
   1.248 +  (condition-case error
   1.249 +      (eval-current-buffer)
   1.250 +    (error (insert YaTeX-generate-bug-message)))
   1.251 +  (pop-to-buffer YaTeX-generate-message-buffer)
   1.252 +)
   1.253 +
   1.254 +(defun YaTeX-generate-parse-add-in (args add-in)
   1.255 +  "Parse add-in string and extract argument for it.
   1.256 +Variable add-in is referred in parent function."
   1.257 +  (let ((i 1) j (case-fold-search nil) ;i holds argument number
   1.258 +	(prompt (make-vector (length args) ""))
   1.259 +	(used (make-vector (length add-in) nil))
   1.260 +	func-name (string ""))
   1.261 +    ;;Phase 1. extract argument from add-in string.
   1.262 +    (mapcar
   1.263 +     '(lambda (arg)
   1.264 +	(let ((index 0) (match 0) beg end (carg (car arg)))
   1.265 +	  (YaTeX-generate-display-message
   1.266 +	   YaTeX-generate-read-prompt-message)
   1.267 +	  (aset prompt (1- i)
   1.268 +		(read-string
   1.269 +		 (format
   1.270 +		  (if YaTeX-japan "%d番目(%s)を読む時?: "
   1.271 +		    "When reading argument #%d(%s)?: ") i (car arg))))
   1.272 +	  (while (string-match (regexp-quote carg) (substring add-in index))
   1.273 +	    (setq beg (+ index (match-beginning 0))
   1.274 +		  end (+ index (match-end 0)))
   1.275 +	    (if (aref used beg) nil
   1.276 +	      (setq match (1+ match))
   1.277 +	      (cond
   1.278 +	       ((= match 1)
   1.279 +		;;(setq arg (append arg (list (list beg end))))
   1.280 +		(YaTeX-generate-register-match))
   1.281 +	       ((YaTeX-generate-ask-match-position)
   1.282 +		(YaTeX-generate-register-match))))
   1.283 +	    (setq index end))
   1.284 +	  (setq i (1+ i))))
   1.285 +     args)
   1.286 +    ;;Phase 2. Generate function!!
   1.287 +    (setq i 0)
   1.288 +    (setq func-name (YaTeX-generate-function-name))
   1.289 +    (while (< i (length add-in))
   1.290 +      (setq beg i j (aref used i))
   1.291 +      (while (and (< i (length add-in)) (equal j (aref used i)))
   1.292 +	(setq i (1+ i)))
   1.293 +      (if j		;If it is argument.
   1.294 +	  (setq string (concat string (format " arg%d" j)))
   1.295 +	(setq string
   1.296 +	      (concat string " \""
   1.297 +		      (YaTeX-generate-quote-quote (substring add-in beg i))
   1.298 +		      "\""))
   1.299 +	))
   1.300 +    (erase-buffer)
   1.301 +    (setq i 1)
   1.302 +    (insert
   1.303 +     "(defun " func-name " ()\n"
   1.304 +     "  (let (")
   1.305 +    (mapcar
   1.306 +     '(lambda (arg)
   1.307 +	(insert (format "(arg%d (read-string \"%s: \"))\n"
   1.308 +			i (aref prompt (1- i))))
   1.309 +	(setq i (1+ i)))
   1.310 +     args)
   1.311 +    (delete-region (point) (progn (forward-line -1) (end-of-line) (point)))
   1.312 +    (insert ")\n(concat " (YaTeX-generate-lisp-quote string)
   1.313 +	    ")))\n")
   1.314 +    (indent-region (point-min) (point) nil)
   1.315 +    used)
   1.316 +)
   1.317 +
   1.318 +(defun YaTeX-generate-ask-match-position ()
   1.319 +  "Ask user whether match-position is in his expectation,
   1.320 +Referencing variables in parent function YaTeX-generate-parse-add-in."
   1.321 +  (pop-to-buffer YaTeX-generate-message-buffer)
   1.322 +  (goto-char (point-max))
   1.323 +  (insert "\n\n"
   1.324 +	  (format (if YaTeX-japan "%d 番目の引数 %s って"
   1.325 +		    "Is argument #%d's value `%s' also corresponding to")
   1.326 +		  i carg) "\n" add-in "\n")
   1.327 +  (indent-to-column beg)
   1.328 +  (let ((c beg))
   1.329 +    (while (< c end) (insert "^") (setq c (1+ c))))
   1.330 +  (insert "\n" (if YaTeX-japan "ここにも対応してるの?"
   1.331 +		 "this underlined part too?"))
   1.332 +  (other-window -1)
   1.333 +  (y-or-n-p (if YaTeX-japan "下線部はあってますか" "Is underline right"))
   1.334 +)
   1.335 +
   1.336 +(defun YaTeX-generate-register-match ()
   1.337 +  (nconc arg (list (list beg end)))
   1.338 +  (let ((x beg))
   1.339 +    (while (< x end) (aset used x i)(setq x (1+ x))))
   1.340 +)
   1.341 +
   1.342 +(defun YaTeX-generate-display-message (mes &optional bottom)
   1.343 +  "Display message to generation buffer."
   1.344 +  (pop-to-buffer YaTeX-generate-message-buffer)
   1.345 +  (goto-char (point-max))
   1.346 +  (insert "\n\n")
   1.347 +  (if bottom (recenter (1- bottom)) (recenter 0))
   1.348 +  (insert mes)
   1.349 +  (other-window -1)
   1.350 +)
   1.351 +
   1.352 +(defun YaTeX-generate-move-to-add-in-position ()
   1.353 +  "Move cursor where add-in function should insert string."
   1.354 +  (cond
   1.355 +   ((eq YaTeX-current-completion-type 'begin)
   1.356 +    (goto-char (point-min))
   1.357 +    (skip-chars-forward "^{")
   1.358 +    (setq env-name
   1.359 +	  (buffer-substring (1+ (point))
   1.360 +			    (progn (skip-chars-forward "^}") (point))))
   1.361 +    (forward-char 1))
   1.362 +   ((eq YaTeX-current-completion-type 'section)
   1.363 +    (goto-char (point-min))
   1.364 +    (skip-chars-forward "^{"))
   1.365 +   ((eq YaTeX-current-completion-type 'maketitle)
   1.366 +    (goto-char (point-max))
   1.367 +    (if (= (preceding-char) ? )
   1.368 +	(forward-char -1)))
   1.369 +   )
   1.370 +)
   1.371 +
   1.372 +(defun YaTeX-generate-function-name ()
   1.373 +  (concat
   1.374 +   "YaTeX:"
   1.375 +   (cond
   1.376 +    ((eq YaTeX-current-completion-type 'begin) env-name)
   1.377 +    ((eq YaTeX-current-completion-type 'section) section-name)
   1.378 +    ((eq YaTeX-current-completion-type 'maketitle) single-command)))
   1.379 +)
   1.380 +
   1.381 +(defun YaTeX-generate-lisp-quote (str)
   1.382 +  (let ((len (length str))(i 0) (quote ""))
   1.383 +    (while (< i len)
   1.384 +      (if (= (aref str i) ?\\)
   1.385 +	  (setq quote (concat quote "\\")))
   1.386 +      (if (= (aref str i) 127)
   1.387 +	  (setq quote (concat quote "\""))
   1.388 +	(setq quote (concat quote (substring str i (1+ i)))))
   1.389 +      (setq i (1+ i)))
   1.390 +    quote)
   1.391 +)
   1.392 +
   1.393 +(defun YaTeX-generate-quote-quote (str)
   1.394 +  (let ((len (length str))(i 0) (quote ""))
   1.395 +    (while (< i len)
   1.396 +      (if (= (aref str i) ?\")
   1.397 +	  (setq quote (concat quote (char-to-string 127))))
   1.398 +      (setq quote (concat quote (substring str i (1+ i))))
   1.399 +      (setq i (1+ i)))
   1.400 +    quote)
   1.401 +)
   1.402 +
   1.403 +(defun YaTeX-suppress-sparse-keymap (map)
   1.404 +  (let ((i ? ))
   1.405 +    (while (< i 127)
   1.406 +      (define-key map (char-to-string i) 'undefined)
   1.407 +      (setq i (1+ i))))
   1.408 +)