X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/profile/blobdiff_plain/77619173fdf73ef9835c877f6376bcfc25733c28..4e7092a3248d55e4af0b45c38a67e3a7998b59a7:/dot/lisp-init.lisp diff --git a/dot/lisp-init.lisp b/dot/lisp-init.lisp index ca38a70..8b0e3f9 100644 --- a/dot/lisp-init.lisp +++ b/dot/lisp-init.lisp @@ -1,25 +1,42 @@ +;;; -*-lisp-*- + (cl:defpackage #:mdw-hacks - (:use #:cl) - (:export #:crank-swank)) + (:use #:cl)) (cl:defparameter mdw-hacks::*previous-package* cl:*package*) (cl:in-package #:mdw-hacks) +;; Shut up. +(setf *load-verbose* nil + *compile-verbose* nil) + +#+cmu +(setf ext:*gc-verbose* nil + ext:*require-verbose* nil) + +#+ecl +(let ((old-output *standard-output*) + (old-prompt si:*tpl-prompt-hook*)) + ;; There doesn't seem to be a good way to do this, so we do it the bad + ;; way. Since the herald is printed to `*standard-outout*', we set (not + ;; bind!) that to a bit bucket, and then arrange to restore it just before + ;; the first REPL prompt is written. + ;; + ;; One more awful part is that, having intercepted the prompt hook, I need + ;; to restore and invoke the old version, and there isn't a clean way to do + ;; this. + (when (<= (ext:argc) 1) + (setf *standard-output* (make-broadcast-stream) + si:*tpl-prompt-hook* (lambda () + (setf *standard-output* old-output + si:*tpl-prompt-hook* old-prompt) + (si::tpl-prompt))))) + ;; Obtain ASDF from somewhere. -#+sbcl (require :asdf) -#+clisp (let ((*compile-verbose* nil) - (*load-verbose* nil)) - (handler-bind ((warning (lambda (cond) - (declare (ignore cond)) - (muffle-warning)))) - (load "/usr/share/common-lisp/source/cl-asdf/asdf.lisp" - :verbose nil) - (funcall (find-symbol "LOAD-SYSTEM" :asdf) :asdf - :verbose nil))) +(require "asdf") -;; Shut up. -(setf *load-verbose* nil) -(setf *compile-verbose* nil) -#+cmu (setf *gc-verbose* nil) +;; Get CMU CL to quit on EOF. +#+cmu +(setf ext:*batch-mode* t) ;; Tell SBCL where to find its source source. #+sbcl @@ -39,7 +56,33 @@ (let* ((homestring (or #+sbcl (sb-ext:posix-getenv "HOME") ("CL:SYSTEMS;**;*.*.*" #p"/usr/share/common-lisp/systems/**/*.*")))) ;; Various fixings. -#+clisp (setf custom:*parse-namestring-ansi* t) +#+clisp +(setf custom:*parse-namestring-ansi* t) + +;; CLisp history. +#+(and clisp readline) +(progn + (export '(*history-file* *history-size*)) + (defvar *history-file* (format nil "~A/.clisp-history" (ext:getenv "HOME")) + "File to preserve the REPL history.") + (defvar *history-size* 1000) + (unless (and (probe-file *history-file*) nil) + (let (old-umask stream) + ;; Ugh. There's no proper open(2) veneer. Play with umask(2) to avoid + ;; a window in which an adversary can open the file. + (unwind-protect + (setf old-umask (os:umask #o077) + stream (open *history-file* + :direction :output + :if-exists :overwrite + :if-does-not-exist :create)) + (when stream (close stream)) + (when old-umask (os:umask old-umask))))) + (readline:read-history *history-file*) + (if *history-size* (readline:stifle-history *history-size*) + (readline:unstifle-history)) + (push (lambda () (readline:write-history *history-file*)) + custom:*fini-hooks*)) ;; Shebang. (set-dispatch-macro-character @@ -49,6 +92,7 @@ (set-dispatch-macro-character (values (read-line stream)))) ;; Start up swank. +(export 'crank-swank) (defun crank-swank (&rest args) (let ((swank (find-package "SWANK"))) (unless swank @@ -58,7 +102,9 @@ (defun crank-swank (&rest args) (set (find-symbol "*GLOBAL-DEBUGGER*" swank) nil) (apply (find-symbol "CREATE-SERVER" swank) args))) -#+asdf (setf asdf:*compile-file-failure-behaviour* :warn) +;; Treat warnings as, err, warnings. +#+asdf +(setf asdf:*compile-file-failure-behaviour* :warn) ;; Done. (pushnew :mdw *features*)