|
|
1.1 ! root 1: ;;; -*- Mode: lisp -*- ! 2: ! 3: ; load in the c functions ! 4: ! 5: (removeaddress '_signal) ! 6: (removeaddress '_switch_to_proc) ! 7: (removeaddress '_set_proc_str) ! 8: ! 9: (cfasl "/src/mdc/ledit/leditcfns.o" '_switch_to_proc 'emacs) ! 10: ! 11: (getaddress '_set_proc_str 'set_proc_str) ! 12: ! 13: (declare (special *ledit-infile* ; emacs->lisp tempfile ! 14: *ledit-outfile* ; lisp->emacs tempfile ! 15: *ledit-ppfile* ; pp->emacs tempfile ! 16: *ledit-lisztfile* ; compiler input ! 17: *ledit-objfile* ; compiler output ! 18: *ledit-initialized*) ; flag ! 19: ) ! 20: ! 21: (setq *ledit-initialized* nil) ! 22: ! 23: ;;; INIT-LEDIT ! 24: ! 25: (defun init-ledit () ! 26: (let ((user (getenv '|USER|))) ;USER must be uppercase ! 27: (setq ! 28: *ledit-outfile* (concat "/tmp/" user ".l2") ; lisp -> emacs ! 29: *ledit-infile* (concat "/tmp/" user ".l1") ; emacs -> lisp ! 30: *ledit-ppfile* (concat "/tmp/" user ".l3") ; pp output to emacs. ! 31: *ledit-lisztfile* (concat "/tmp/" user ".l4") ! 32: *ledit-objfile* (concat "/tmp/" user ".o") ! 33: *ledit-initialized* t))) ! 34: ! 35: ;;; LEDIT ! 36: ; if 1 arg, arg is taken as a tag name to pass to emacs. ! 37: ; if 2 args, second arg is a keyword. If 2nd arg is pp, ! 38: ; pp is applied to first arg, and result is sent to emacs ! 39: ; to put in a buffer called LEDIT (which is first erased.) ! 40: ! 41: (defun ledit fexpr (args) ! 42: (apply #'ledit* args)) ! 43: ! 44: ;;; LEDIT* ! 45: ! 46: (defun ledit* n ! 47: (if (not *ledit-initialized*) (init-ledit)) ! 48: (ledit-output (listify n)) ! 49: (syscall 10. *ledit-infile*) ; syscall 10 is "delete" ! 50: (syscall 10. *ledit-lisztfile*) ! 51: (emacs) ! 52: (ledit-input) ! 53: (syscall 10. *ledit-outfile*) ! 54: (syscall 10. *ledit-ppfile*) ! 55: t) ! 56: ! 57: ;;; LEDIT-OUTPUT ! 58: ;;; Egad, what a mess! Doesn't work for XEMACS yet. ! 59: ;;; Here's an example from Moclisp: ! 60: ;;; -> (defun bar (nothing) (bar nothing)) ! 61: ;;; bar ! 62: ;;; -> (ledit bar) ! 63: ;;; should produce... ! 64: ;;; (progn) (progn tag (setq tag "bar") (&goto-tag)) ! 65: ;;; and ! 66: ;;; -> (ledit bar pp) ! 67: ;;; should stuff this to emacs... ! 68: ;;; (progn) (switch-to-buffer "LEDIT") (erase-buffer) ! 69: ;;; (insert-file "/tmp/walter.l3") (lisp-mode) ! 70: ;;; and this... ! 71: ;;; (def bar ! 72: ;;; (lambda (x) ! 73: ;;; (bar nothing))) ! 74: ;;; into *LEDIT* ! 75: ! 76: (defun ledit-output (args) ! 77: (if args ! 78: (let ((ofile (outfile *ledit-outfile*))) ! 79: (format ofile "(progn)") ; this is necessary. ! 80: ! 81: (cond ((null (cdr args)) ; no keyword -> arg is a tag. ! 82: (format ofile "(progn tag (setq tag \"~A\"~ ! 83: (&goto-tag))" ! 84: (car args))) ! 85: ((eq (cadr args) 'pp) ; pp-> pp first arg to emacs ! 86: (apply 'pp `((|F| ,*ledit-ppfile*) ,(car args))) ! 87: (format ofile "(switch-to-buffer \"LEDIT\")~ ! 88: (erase-buffer)") ! 89: (format ofile "(insert-file \"~A\")" ! 90: *ledit-ppfile*) ! 91: (format ofile "(lisp-mode)")) ! 92: ! 93: (t (format t "~&~A -- unknown option~%" (cdr args)))) ! 94: (close ofile)))) ! 95: ! 96: ;;; LISZT* ! 97: ;;; Need this guy to do compile-input. ! 98: ;;; Liszt returns 0 if all was well. ! 99: ;;; Note that in ordinary use the user will have to get used to looking ! 100: ;;; at "%Warning: ... Compiler declared *foo* special" messages, since ! 101: ;;; you don't usually want to hunt around in your file, zap in the the ! 102: ;;; declarations, then go back to what you were doing. ! 103: ;;; Fortunately this doesn't cause the compiler to bomb. ! 104: ;;; Some sleepless night I will think of a way to get around this. ! 105: ! 106: (defun liszt* (&rest args) ! 107: (apply #'liszt args)) ! 108: ! 109: ;;; LEDIT-INPUT ! 110: ;;; Although there are two cases here, in practice ! 111: ;;; it is never the case that there is both input to be ! 112: ;;; interpreted and input to be compiled. ! 113: ! 114: (defun ledit-input () ! 115: (if (probef *ledit-lisztfile*) ! 116: (cond ((getd #'liszt) ! 117: (format t ";Compiling LEDIT:") ! 118: (and (zerop (liszt* *ledit-lisztfile* '-o *ledit-objfile*)) ! 119: (load *ledit-objfile*))) ! 120: (t (format t ";Can't compile LEDIT: No liszt.~%;Reading instead:") ! 121: (let ((ifile (infile *ledit-lisztfile*))) ! 122: (ledit-load ifile) ! 123: (close ifile))))) ! 124: ! 125: (if (probef *ledit-infile*) ! 126: (let ((ifile (infile *ledit-infile*))) ! 127: (format t ";Reading from LEDIT:~%") ! 128: (ledit-load ifile) ! 129: (close ifile)))) ! 130: ! 131: ;;; LEDIT-LOAD ! 132: ;;; A generally useful form of load ! 133: ! 134: (defun ledit-load (ifile) ! 135: (let ((eof-form (list 'eof-form))) ! 136: (do ((form (read ifile eof-form) (read ifile eof-form))) ! 137: ((eq form eof-form)) ! 138: (format t "; ~A~%" (eval form))))) ! 139: ! 140: (setsyntax #/ 'macro 'ledit) ; make ^E = (ledit)<return> ! 141: ! 142: ;; more robust version of the c function set_proc_str. Does argument checking. ! 143: ;; set_proc_str sets the string that is stuffed to the tty after franz pauses ! 144: ;; and the csh wakes up. It is usually "%emacs" or "%vemacs" or "%?emacs" ! 145: (defun set-proc-str (arg) ! 146: (if (stringp arg) ! 147: (set_proc_str arg) ! 148: (if (symbolp arg) ! 149: (set_proc_str (get-pname arg)) ! 150: (error arg " is illegal argument to set-proc-str"))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.