comparison lisp/calc/calc-aent.el @ 110162:6ea012a6203d

* lisp/calc/calc-aent.el (calcAlg-blink-matching-check): New fun, to replace calcAlg-blink-matching-open. (calc-alg-ent-map, calc-alg-ent-esc-map): Initialize in the declaration. (calc-do-alg-entry): Only touch the part of the keymap that varies. Use the new blink-matching-check-function.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 03 Sep 2010 13:26:08 +0200
parents d150a25a0eb9
children 417b1e4d63cd
comparison
equal deleted inserted replaced
110161:eb977e012180 110162:6ea012a6203d
313 (setq alg-exp (cdr alg-exp) 313 (setq alg-exp (cdr alg-exp)
314 nvals (cdr nvals) 314 nvals (cdr nvals)
315 calc-dollar-used 0))) 315 calc-dollar-used 0)))
316 (calc-handle-whys)))) 316 (calc-handle-whys))))
317 317
318 (defvar calc-alg-ent-map nil 318 (defvar calc-alg-ent-map
319 (let ((map (make-sparse-keymap)))
320 (set-keymap-parent map minibuffer-local-map)
321 (define-key map "'" 'calcAlg-previous)
322 (define-key map "`" 'calcAlg-edit)
323 (define-key map "\C-m" 'calcAlg-enter)
324 (define-key map "\C-j" 'calcAlg-enter)
325 map)
319 "The keymap used for algebraic entry.") 326 "The keymap used for algebraic entry.")
320 327
321 (defvar calc-alg-ent-esc-map nil 328 (defvar calc-alg-ent-esc-map
329 (let ((map (make-keymap))
330 (i 33))
331 (set-keymap-parent map esc-map)
332 (while (< i 127)
333 (define-key map (vector i) 'calcAlg-escape)
334 (setq i (1+ i)))
335 map)
322 "The keymap used for escapes in algebraic entry.") 336 "The keymap used for escapes in algebraic entry.")
323 337
324 (defvar calc-alg-exp) 338 (defvar calc-alg-exp)
325 339
326 ;;;###autoload 340 ;;;###autoload
327 (defun calc-do-alg-entry (&optional initial prompt no-normalize history) 341 (defun calc-do-alg-entry (&optional initial prompt no-normalize history)
328 (let* ((calc-buffer (current-buffer)) 342 (let* ((calc-buffer (current-buffer))
329 (blink-paren-function 'calcAlg-blink-matching-open) 343 (blink-matching-check-function 'calcAlg-blink-matching-check)
330 (calc-alg-exp 'error)) 344 (calc-alg-exp 'error))
331 (unless calc-alg-ent-map
332 (setq calc-alg-ent-map (copy-keymap minibuffer-local-map))
333 (define-key calc-alg-ent-map "'" 'calcAlg-previous)
334 (define-key calc-alg-ent-map "`" 'calcAlg-edit)
335 (define-key calc-alg-ent-map "\C-m" 'calcAlg-enter)
336 (define-key calc-alg-ent-map "\C-j" 'calcAlg-enter)
337 (let ((i 33))
338 (setq calc-alg-ent-esc-map (copy-keymap esc-map))
339 (while (< i 127)
340 (aset (nth 1 calc-alg-ent-esc-map) i 'calcAlg-escape)
341 (setq i (1+ i)))))
342 (define-key calc-alg-ent-map "\e" nil) 345 (define-key calc-alg-ent-map "\e" nil)
343 (if (eq calc-algebraic-mode 'total) 346 (if (eq calc-algebraic-mode 'total)
344 (define-key calc-alg-ent-map "\e" calc-alg-ent-esc-map) 347 (define-key calc-alg-ent-map "\e" calc-alg-ent-esc-map)
345 (define-key calc-alg-ent-map "\e+" 'calcAlg-plus-minus) 348 (define-key calc-alg-ent-map "\e+" 'calcAlg-plus-minus)
346 (define-key calc-alg-ent-map "\em" 'calcAlg-mod) 349 (define-key calc-alg-ent-map "\em" 'calcAlg-mod)
428 (setq calc-alg-exp (if (calc-minibuffer-contains "\\` *\\[ *\\'") 431 (setq calc-alg-exp (if (calc-minibuffer-contains "\\` *\\[ *\\'")
429 '((incomplete vec)) 432 '((incomplete vec))
430 exp)) 433 exp))
431 (exit-minibuffer)))) 434 (exit-minibuffer))))
432 435
433 (defun calcAlg-blink-matching-open () 436 (defun calcAlg-blink-matching-check (leftpt rightpt)
434 (let ((rightpt (point)) 437 (let ((rightchar (char-before rightpt))
435 (leftpt nil) 438 (leftchar (if leftpt (char-after leftpt))))
436 (rightchar (preceding-char))
437 leftchar
438 rightsyntax
439 leftsyntax)
440 (save-excursion
441 (condition-case ()
442 (setq leftpt (scan-sexps rightpt -1)
443 leftchar (char-after leftpt))
444 (error nil)))
445 (if (and leftpt 439 (if (and leftpt
446 (or (and (= rightchar ?\)) 440 (or (and (= rightchar ?\))
447 (= leftchar ?\[)) 441 (= leftchar ?\[))
448 (and (= rightchar ?\]) 442 (and (= rightchar ?\])
449 (= leftchar ?\())) 443 (= leftchar ?\()))
450 (save-excursion 444 (save-excursion
451 (goto-char leftpt) 445 (goto-char leftpt)
452 (looking-at ".+\\(\\.\\.\\|\\\\dots\\|\\\\ldots\\)"))) 446 (looking-at ".+\\(\\.\\.\\|\\\\dots\\|\\\\ldots\\)")))
453 (let ((leftsaved (aref (syntax-table) leftchar)) 447 ;; [2..5) perfectly valid!
454 (rightsaved (aref (syntax-table) rightchar))) 448 nil
455 (unwind-protect 449 (blink-matching-check-mismatch leftpt rightpt))))
456 (progn
457 (cond ((= leftchar ?\[)
458 (aset (syntax-table) leftchar (cons 4 ?\)))
459 (aset (syntax-table) rightchar (cons 5 ?\[)))
460 (t
461 (aset (syntax-table) leftchar (cons 4 ?\]))
462 (aset (syntax-table) rightchar (cons 5 ?\())))
463 (blink-matching-open))
464 (aset (syntax-table) leftchar leftsaved)
465 (aset (syntax-table) rightchar rightsaved)))
466 (blink-matching-open))))
467 450
468 ;;;###autoload 451 ;;;###autoload
469 (defun calc-alg-digit-entry () 452 (defun calc-alg-digit-entry ()
470 (calc-alg-entry 453 (calc-alg-entry
471 (cond ((eq last-command-event ?e) 454 (cond ((eq last-command-event ?e)