geiser-0.8.1/0000755000175000017500000000000012607252047010004 500000000000000geiser-0.8.1/elisp/0000755000175000017500000000000012607252046011117 500000000000000geiser-0.8.1/elisp/geiser-guile.el0000644000175000017500000003444112604476701013753 00000000000000;; geiser-guile.el -- guile's implementation of the geiser protocols ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Mar 08, 2009 23:03 (require 'geiser-connection) (require 'geiser-syntax) (require 'geiser-custom) (require 'geiser-base) (require 'geiser-eval) (require 'geiser-edit) (require 'geiser-log) (require 'geiser) (require 'compile) (require 'info-look) (eval-when-compile (require 'cl)) ;;; Customization: (defgroup geiser-guile nil "Customization for Geiser's Guile flavour." :group 'geiser) (geiser-custom--defcustom geiser-guile-binary (cond ((eq system-type 'windows-nt) "guile.exe") ((eq system-type 'darwin) "guile") (t "guile")) "Name to use to call the Guile executable when starting a REPL." :type '(choice string (repeat string)) :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-load-path nil "A list of paths to be added to Guile's load path when it's started." :type '(repeat file) :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-init-file "~/.guile-geiser" "Initialization file with user code for the Guile REPL. If all you want is to load ~/.guile, set `geiser-guile-load-init-file-p' instead." :type 'string :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-load-init-file-p nil "Whether to load ~/.guile when starting Guile. Note that, due to peculiarities in the way Guile loads its init file, using `geiser-guile-init-file' is not equivalent to setting this variable to t." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-debug-show-bt-p nil "Whether to autmatically show a full backtrace when entering the debugger. If `nil', only the last frame is shown." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-jump-on-debug-p nil "Whether to autmatically jump to error when entering the debugger. If `t', Geiser will use `next-error' to jump to the error's location." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-show-debug-help-p t "Whether to show brief help in the echo area when entering the debugger." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-warning-level 'medium "Verbosity of the warnings reported by Guile. You can either choose one of the predefined warning sets, or provide a list of symbols identifying the ones you want. Possible choices are arity-mismatch, unbound-variable, unused-variable and unused-toplevel. Unrecognised symbols are ignored. The predefined levels are: - Medium: arity-mismatch, unbound-variable, format - High: arity-mismatch, unbound-variable, unused-variable, format - None: no warnings Changes to the value of this variable will automatically take effect on new REPLs. For existing ones, use the command \\[geiser-guile-update-warning-level]." :type '(choice (const :tag "Medium (arity and unbound vars)" medium) (const :tag "High (also unused vars)" high) (const :tag "No warnings" none) (repeat :tag "Custom" symbol)) :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-extra-keywords nil "Extra keywords highlighted in Guile scheme buffers." :type '(repeat string) :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-case-sensitive-p t "Non-nil means keyword highlighting is case-sensitive." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-manual-lookup-other-window-p nil "Non-nil means pop up the Info buffer in another window." :type 'boolean :group 'geiser-guile) (geiser-custom--defcustom geiser-guile-manual-lookup-nodes '("Guile" "guile-2.0") "List of info nodes that, when present, are used for manual lookups" :type '(repeat string) :group 'geiser-guile) ;;; REPL support: (defun geiser-guile--binary () (if (listp geiser-guile-binary) (car geiser-guile-binary) geiser-guile-binary)) (defun geiser-guile--parameters () "Return a list with all parameters needed to start Guile. This function uses `geiser-guile-init-file' if it exists." (let ((init-file (and (stringp geiser-guile-init-file) (expand-file-name geiser-guile-init-file))) (q-flags (and (not geiser-guile-load-init-file-p) '("-q")))) `(,@(and (listp geiser-guile-binary) (cdr geiser-guile-binary)) ,@q-flags "-L" ,(expand-file-name "guile/" geiser-scheme-dir) ,@(apply 'append (mapcar (lambda (p) (list "-L" p)) geiser-guile-load-path)) ,@(and init-file (file-readable-p init-file) (list "-l" init-file))))) ;;(defconst geiser-guile--prompt-regexp "^[^() \n]+@([^)]*?)> ") (defconst geiser-guile--prompt-regexp "[^@()]+@([^)]*?)> ") (defconst geiser-guile--debugger-prompt-regexp "[^@()]+@([^)]*?) \\[[0-9]+\\]> ") ;;; Evaluation support: (defsubst geiser-guile--linearize-args (args) (mapconcat 'identity args " ")) (defun geiser-guile--geiser-procedure (proc &rest args) (case proc ((eval compile) (format ",geiser-eval %s %s%s" (or (car args) "#f") (geiser-guile--linearize-args (cdr args)) (if (cddr args) "" " ()"))) ((load-file compile-file) (format ",geiser-load-file %s" (car args))) ((no-values) ",geiser-no-values") (t (format "ge:%s (%s)" proc (geiser-guile--linearize-args args))))) (defconst geiser-guile--module-re "(define-module +\\(([^)]+)\\)") (defconst geiser-guile--library-re "(library +\\(([^)]+)\\)") (defun geiser-guile--get-module (&optional module) (cond ((null module) (save-excursion (geiser-syntax--pop-to-top) (if (or (re-search-backward geiser-guile--module-re nil t) (looking-at geiser-guile--library-re) (re-search-forward geiser-guile--module-re nil t)) (geiser-guile--get-module (match-string-no-properties 1)) :f))) ((listp module) module) ((stringp module) (condition-case nil (car (geiser-syntax--read-from-string module)) (error :f))) (t :f))) (defun geiser-guile--module-cmd (module fmt &optional def) (when module (let* ((module (geiser-guile--get-module module)) (module (cond ((or (null module) (eq module :f)) def) (t (format "%s" module))))) (and module (format fmt module))))) (defun geiser-guile--import-command (module) (geiser-guile--module-cmd module ",use %s")) (defun geiser-guile--enter-command (module) (geiser-guile--module-cmd module ",m %s" "(guile-user)")) (defun geiser-guile--exit-command () ",q") (defun geiser-guile--symbol-begin (module) (if module (max (save-excursion (beginning-of-line) (point)) (save-excursion (skip-syntax-backward "^(>") (1- (point)))) (save-excursion (skip-syntax-backward "^'-()>") (point)))) ;;; Error display (defun geiser-guile--enter-debugger () (let ((bt-cmd (format ",geiser-newline\n,error-message\n,%s\n" (if geiser-guile-debug-show-bt-p "bt" "fr")))) (compilation-forget-errors) (goto-char (point-max)) (geiser-repl--prepare-send) (comint-send-string nil bt-cmd) (when geiser-guile-show-debug-help-p (message "Debug REPL. Enter ,q to quit, ,h for help.")) (when geiser-guile-jump-on-debug-p (accept-process-output (get-buffer-process (current-buffer)) 0.2 nil t) (ignore-errors (next-error))))) (defun geiser-guile--display-error (module key msg) (newline) (when (stringp msg) (save-excursion (insert msg)) (geiser-edit--buttonize-files)) (and (not key) msg (not (zerop (length msg))))) ;;; Trying to ascertain whether a buffer is Guile Scheme: (defconst geiser-guile--guess-re (format "\\(%s\\|#! *.+\\(/\\| \\)guile\\( *\\\\\\)?\\)" geiser-guile--module-re)) (defun geiser-guile--guess () (save-excursion (goto-char (point-min)) (re-search-forward geiser-guile--guess-re nil t))) ;;; Keywords and syntax (defconst geiser-guile--builtin-keywords '("call-with-input-file" "call-with-input-string" "call-with-output-file" "call-with-output-string" "call-with-prompt" "call-with-trace" "define-accessor" "define-class" "define-enumeration" "define-inlinable" "define-syntax-parameter" "eval-when" "lambda*" "syntax-parameterize" "use-modules" "with-error-to-file" "with-error-to-port" "with-error-to-string" "with-fluid*" "with-fluids" "with-fluids*" "with-input-from-port" "with-input-from-string" "with-output-to-port" "with-output-to-string")) (defun geiser-guile--keywords () (append (geiser-syntax--simple-keywords geiser-guile-extra-keywords) (geiser-syntax--simple-keywords geiser-guile--builtin-keywords) `((,(rx "(" (group "define-once") eow (* space) (? (group (+ word)))) (1 font-lock-keyword-face) (2 font-lock-variable-name-face nil t)) ("(\\(define-module\\) +(\\([^)]+\\))" (1 font-lock-keyword-face) (2 font-lock-type-face nil t))))) (geiser-syntax--scheme-indent (c-declare 0) (c-lambda 2) (call-with-input-string 1) (call-with-output-string 0) (call-with-prompt 1) (call-with-trace 0) (eval-when 1) (lambda* 1) (pmatch defun) (sigaction 1) (syntax-parameterize 1) (with-error-to-file 1) (with-error-to-port 1) (with-error-to-string 0) (with-fluid* 1) (with-fluids 1) (with-fluids* 1) (with-input-from-string 1) (with-method 1) (with-mutex 1) (with-output-to-string 0) (with-throw-handler 1)) ;;; Compilation shell regexps (defconst geiser-guile--path-rx "^In \\([^:\n ]+\\):\n") (defconst geiser-guile--rel-path-rx "^In +\\([^/\n :]+\\):\n") (defvar geiser-guile--file-cache (make-hash-table :test 'equal)) (defun geiser-guile--resolve-file (file) (when (and (stringp file) (not (member file '("socket" "stdin" "unknown file")))) (if (file-name-absolute-p file) file (or (gethash file geiser-guile--file-cache) (puthash file (geiser-eval--send/result `(:eval (:ge find-file ,file))) geiser-guile--file-cache))))) (defun geiser-guile--resolve-file-x () (let ((f (geiser-guile--resolve-file (match-string-no-properties 1)))) (and (stringp f) (list f)))) ;;; REPL startup (defconst geiser-guile-minimum-version "2.0") (defun geiser-guile--version (binary) (shell-command-to-string (format "%s -c '(display (version))'" binary))) (defun geiser-guile-update-warning-level () "Update the warning level used by the REPL. The new level is set using the value of `geiser-guile-warning-level'." (interactive) (let ((code `(:eval (:ge set-warnings ',geiser-guile-warning-level) (geiser evaluation)))) (geiser-eval--send/result code))) (defun connect-to-guile () "Start a Guile REPL connected to a remote process. Start the external Guile process with the flag --listen to make it spawn a server thread." (interactive) (geiser-connect 'guile)) (defun geiser-guile--set-geiser-load-path () (let* ((path (expand-file-name "guile/" geiser-scheme-dir)) (witness "geiser/emacs.scm") (code `(begin (if (not (%search-load-path ,witness)) (set! %load-path (cons ,path %load-path))) 'done))) (geiser-eval--send/wait code))) (defun geiser-guile--startup (remote) (set (make-local-variable 'compilation-error-regexp-alist) `((,geiser-guile--path-rx geiser-guile--resolve-file-x) ("^ +\\([0-9]+\\):\\([0-9]+\\)" nil 1 2))) (compilation-setup t) (font-lock-add-keywords nil `((,geiser-guile--path-rx 1 compilation-error-face))) (let ((geiser-log-verbose-p t)) (when remote (geiser-guile--set-geiser-load-path)) (geiser-eval--send/wait ",use (geiser emacs)\n'done") (dolist (dir geiser-guile-load-path) (let ((dir (expand-file-name dir))) (geiser-eval--send/wait `(:eval (:ge add-to-load-path ,dir))))) (geiser-guile-update-warning-level))) ;;; Manual lookup (defun geiser-guile--info-spec (&optional nodes) (let* ((nrx "^[ ]+-+ [^:]+:[ ]*") (drx "\\b") (res (when (Info-find-file "r5rs" t) `(("(r5rs)Index" nil ,nrx ,drx))))) (dolist (node (or nodes geiser-guile-manual-lookup-nodes) res) (when (Info-find-file node t) (mapc (lambda (idx) (add-to-list 'res (list (format "(%s)%s" node idx) nil nrx drx))) '("Variable Index" "Procedure Index" "R5RS Index")))))) (info-lookup-add-help :topic 'symbol :mode 'geiser-guile-mode :ignore-case nil :regexp "[^()`',\" \n]+" :doc-spec (geiser-guile--info-spec)) (defun guile--manual-look-up (id mod) (let ((info-lookup-other-window-flag geiser-guile-manual-lookup-other-window-p)) (info-lookup-symbol id 'geiser-guile-mode)) (when geiser-guile-manual-lookup-other-window-p (switch-to-buffer-other-window "*info*")) (search-forward (format "%s" id) nil t)) ;;; Implementation definition: (define-geiser-implementation guile (binary geiser-guile--binary) (arglist geiser-guile--parameters) (version-command geiser-guile--version) (minimum-version geiser-guile-minimum-version) (repl-startup geiser-guile--startup) (prompt-regexp geiser-guile--prompt-regexp) (debugger-prompt-regexp geiser-guile--debugger-prompt-regexp) (enter-debugger geiser-guile--enter-debugger) (marshall-procedure geiser-guile--geiser-procedure) (find-module geiser-guile--get-module) (enter-command geiser-guile--enter-command) (exit-command geiser-guile--exit-command) (import-command geiser-guile--import-command) (find-symbol-begin geiser-guile--symbol-begin) (display-error geiser-guile--display-error) (external-help guile--manual-look-up) (check-buffer geiser-guile--guess) (keywords geiser-guile--keywords) (case-sensitive geiser-guile-case-sensitive-p)) (geiser-impl--add-to-alist 'regexp "\\.scm$" 'guile t) (provide 'geiser-guile) geiser-0.8.1/elisp/geiser-eval.el0000644000175000017500000001624412606701327013573 00000000000000;;; geiser-eval.el -- sending scheme code for evaluation ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 07, 2009 22:35 ;; Functions, building on top of geiser-connection, to evaluate scheme ;; code. (require 'geiser-impl) (require 'geiser-connection) (require 'geiser-syntax) (require 'geiser-log) (require 'geiser-base) ;;; Plug-able functions: (make-variable-buffer-local (defvar geiser-eval--get-module-function nil)) (set-default 'geiser-eval--get-module-function nil) (defvar geiser-eval--get-impl-module nil) (geiser-impl--register-local-method 'geiser-eval--get-impl-module 'find-module '(lambda (&rest) nil) "Function used to obtain the module for current buffer. It takes an optional argument, for cases where we want to force its value.") (defun geiser-eval--get-module (&optional module) (if geiser-eval--get-module-function (funcall geiser-eval--get-module-function module) (funcall geiser-eval--get-impl-module module))) (defvar geiser-eval--geiser-procedure-function) (geiser-impl--register-local-method 'geiser-eval--geiser-procedure-function 'marshall-procedure 'identity "Function to translate a bare procedure symbol to one executable in the Scheme context. Return NULL for unsupported ones; at the very least, EVAL, COMPILE, LOAD-FILE and COMPILE-FILE should be supported.") (defvar geiser-eval--unsupported nil) (geiser-impl--register-local-variable 'geiser-eval--unsupported 'unsupported-procedures nil "A list, or function returning a list, of the Geiser procedures not implemented by this Scheme implementation. Possible values include macroexpand, completions, module-completions, find-file, symbol-location, module-location, symbol-documentation, module-exports, autodoc, callers, callees and generic-methods.") (defun geiser-eval--supported-p (feat) (or (not geiser-eval--unsupported) (not (memq feat geiser-eval--unsupported)))) (defsubst geiser-eval--form (&rest args) (when (not (geiser-eval--supported-p (car args))) (error "Sorry, the %s scheme implementation does not support Geiser's %s" geiser-impl--implementation (car args))) (apply geiser-eval--geiser-procedure-function args)) ;;; Code formatting: (defsubst geiser-eval--load-file (file) (geiser-eval--form 'load-file (geiser-eval--scheme-str file))) (defsubst geiser-eval--comp-file (file) (geiser-eval--form 'compile-file (geiser-eval--scheme-str file))) (defsubst geiser-eval--module (code) (geiser-eval--scheme-str (cond ((or (null code) (eq code :t) (eq code :buffer)) (geiser-eval--get-module)) ((or (eq code :repl) (eq code :f)) :f) (t (geiser-eval--get-module code))))) (defsubst geiser-eval--eval (code) (geiser-eval--form 'eval (geiser-eval--module (nth 1 code)) (geiser-eval--scheme-str (nth 0 code)))) (defsubst geiser-eval--comp (code) (geiser-eval--form 'compile (geiser-eval--module (nth 1 code)) (geiser-eval--scheme-str (nth 0 code)))) (defsubst geiser-eval--ge (proc args) (apply 'geiser-eval--form (cons proc (mapcar 'geiser-eval--scheme-str args)))) (defun geiser-eval--scheme-str (code) (cond ((null code) "'()") ((eq code :f) "#f") ((eq code :t) "#t") ((listp code) (cond ((eq (car code) :eval) (geiser-eval--eval (cdr code))) ((eq (car code) :comp) (geiser-eval--comp (cdr code))) ((eq (car code) :load-file) (geiser-eval--load-file (cadr code))) ((eq (car code) :comp-file) (geiser-eval--comp-file (cadr code))) ((eq (car code) :module) (geiser-eval--module (cadr code))) ((eq (car code) :ge) (geiser-eval--ge (cadr code) (cddr code))) ((eq (car code) :scm) (cadr code)) (t (concat "(" (mapconcat 'geiser-eval--scheme-str code " ") ")")))) ((symbolp code) (substring-no-properties (format "%s" code))) (t (substring-no-properties (format "%S" code))))) ;;; Code sending: (defvar geiser-eval--default-connection-function nil) (defsubst geiser-eval--connection () (and geiser-eval--default-connection-function (funcall geiser-eval--default-connection-function))) (defsubst geiser-eval--log (s) (geiser-log--info "RETORT: %S" s) s) (defsubst geiser-eval--code-str (code) (if (stringp code) code (geiser-eval--scheme-str code))) (defsubst geiser-eval--send (code cont &optional buffer) (geiser-con--send-string (geiser-eval--connection) (geiser-eval--code-str code) cont buffer)) (defvar geiser-eval--sync-retort nil) (defun geiser-eval--set-sync-retort (s) (setq geiser-eval--sync-retort (geiser-eval--log s))) (defun geiser-eval--send/wait (code &optional timeout buffer) (setq geiser-eval--sync-retort nil) (geiser-con--send-string/wait (geiser-eval--connection) (geiser-eval--code-str code) 'geiser-eval--set-sync-retort timeout buffer) geiser-eval--sync-retort) ;;; Retort parsing: (defsubst geiser-eval--retort-p (ret) (and (listp ret) (or (assoc 'error ret) (assoc 'result ret)))) (defsubst geiser-eval--retort-result (ret) (let ((values (cdr (assoc 'result ret)))) (car (geiser-syntax--read-from-string (car values))))) (defsubst geiser-eval--send/result (code &optional timeout buffer) (geiser-eval--retort-result (geiser-eval--send/wait code timeout buffer))) (defun geiser-eval--retort-result-str (ret prefix) (let* ((prefix (or prefix "=> ")) (nlprefix (concat "\n" prefix)) (values (cdr (assoc 'result ret)))) (if values (concat prefix (mapconcat 'identity values nlprefix)) (or prefix "(No value)")))) (defsubst geiser-eval--retort-output (ret) (cdr (assoc 'output ret))) (defsubst geiser-eval--retort-error (ret) (cdr (assoc 'error ret))) (defsubst geiser-eval--error-key (err) (cdr (assoc 'key err))) (defsubst geiser-eval--error-subr (err) (cdr (assoc 'subr err))) (defsubst geiser-eval--error-msg (err) (cdr (assoc 'msg err))) (defsubst geiser-eval--error-rest (err) (cdr (assoc 'rest err))) (defun geiser-eval--error-str (err) (let* ((key (geiser-eval--error-key err)) (key-str (if key (format ": %s" key) ":")) (subr (geiser-eval--error-subr err)) (subr-str (if subr (format " (%s):" subr) "")) (msg (geiser-eval--error-msg err)) (msg-str (if msg (format "\n %s" msg) "")) (rest (geiser-eval--error-rest err)) (rest-str (if rest (format "\n %s" rest) ""))) (format "Error%s%s%s%s" subr-str key-str msg-str rest-str))) (provide 'geiser-eval) geiser-0.8.1/elisp/geiser-debug.el0000644000175000017500000001647112606701535013735 00000000000000;;; geiser-debug.el -- displaying debug information and evaluation results ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Feb 23, 2009 22:34 (require 'geiser-edit) (require 'geiser-autodoc) (require 'geiser-impl) (require 'geiser-eval) (require 'geiser-menu) (require 'geiser-popup) (require 'geiser-base) (require 'geiser-image) ;;; Customization: (defgroup geiser-debug nil "Debugging and error display options." :group 'geiser) (geiser-custom--defcustom geiser-debug-always-display-sexp-after-p nil "Whether to always display the sexp whose evaluation caused an error after the error message in the debug pop-up. If nil, expressions shorter than `geiser-debug-long-sexp-lines` lines are show before the error message." :group 'geiser-debug :type 'boolean) (geiser-custom--defcustom geiser-debug-long-sexp-lines 6 "Length of an expression in order to be relegated to the bottom of the debug pop-up (after the error message). If `geiser-debug-always-display-sexp-after-p` is t, this variable has no effect." :group 'geiser-debug :type 'int) (geiser-custom--defcustom geiser-debug-jump-to-debug-p t "When set to t (the default), jump to the debug pop-up buffer in case of evaluation errors. See also `geiser-debug-show-debug-p`. " :group 'geiser-debug :type 'boolean) (geiser-custom--defcustom geiser-debug-show-debug-p t "When set to t (the default), show the debug pop-up buffer in case of evaluation errors. This option takes effect even if `geiser-debug-jump-to-debug-p` is set." :group 'geiser-debug :type 'boolean) (geiser-custom--defcustom geiser-debug-auto-display-images-p t "Whether to automatically invoke the external viewer to display images when they're evaluated. See also `geiser-repl-auto-display-images-p'." :group 'geiser-debug :type 'boolean) ;;; Debug buffer mode: (defvar geiser-debug-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (set-keymap-parent map button-buffer-map) map)) (defun geiser-debug-mode () "A major mode for displaying Scheme compilation and evaluation results. \\{geiser-debug-mode-map}" (interactive) (kill-all-local-variables) (buffer-disable-undo) (use-local-map geiser-debug-mode-map) (set-syntax-table scheme-mode-syntax-table) (setq mode-name "Geiser DBG") (setq major-mode 'geiser-debug-mode) (setq next-error-function 'geiser-edit--open-next) (setq buffer-read-only t)) (defun geiser-debug--button-p (nextp) (let ((m (funcall (if nextp 'next-button 'previous-button) (point)))) (and m (funcall (if nextp '< '>) (point) (marker-position m))))) (geiser-menu--defmenu debug geiser-debug-mode-map ("Next error" "n" forward-button :enable (geiser-debug--button-p t)) ("Previous error" "p" backward-button :enable (geiser-debug--button-p t)) -- ("Quit" nil View-quit)) ;;; Buffer for displaying evaluation results: (geiser-popup--define debug "*Geiser dbg*" geiser-debug-mode) ;;; Displaying retorts (geiser-impl--define-caller geiser-debug--display-error display-error (module key message) "This method takes 3 parameters (a module name, the error key, and the accompanying error message) and should display (in the current buffer) a formatted version of the error. If the error was successfully displayed, the call should evaluate to a non-null value.") (geiser-impl--define-caller geiser-debug--enter-debugger enter-debugger () "This method is called upon entering the debugger, in the REPL buffer.") (defun geiser-debug--display-after (what) (or geiser-debug-always-display-sexp-after-p (>= (with-temp-buffer (insert what) (count-lines (point-min) (point-max))) geiser-debug-long-sexp-lines))) (defun geiser-debug--insert-res (res) (let ((begin (point))) (insert res) (let ((end (point))) (goto-char begin) (let ((no (geiser-image--replace-images t geiser-debug-auto-display-images-p))) (goto-char end) (newline 2) (and no (> no 0)))))) (defun geiser-debug--display-retort (what ret &optional res auto-p) (let* ((err (geiser-eval--retort-error ret)) (key (geiser-eval--error-key err)) (output (geiser-eval--retort-output ret)) (impl geiser-impl--implementation) (module (geiser-eval--get-module)) (dbg nil) (img nil) (dir default-directory) (buffer (current-buffer)) (debug (eq key 'geiser-debugger)) (after (geiser-debug--display-after what))) (when debug (switch-to-geiser nil nil buffer) (geiser-debug--enter-debugger impl)) (geiser-debug--with-buffer (erase-buffer) (when dir (setq default-directory dir)) (unless after (geiser-debug--display-error impl module nil what) (newline 2)) (setq img (when (and res (not err)) (geiser-debug--insert-res res))) (setq dbg (geiser-debug--display-error impl module key output)) (when after (goto-char (point-max)) (insert "\nExpression evaluated was:\n\n") (geiser-debug--display-error impl module nil what)) (goto-char (point-min))) (when (or img dbg) (geiser-debug--pop-to-buffer) (when (and dbg (not geiser-debug-jump-to-debug-p)) (next-error) (when (not geiser-debug-show-debug-p) (pop-to-buffer (geiser-debug--buffer) 'display-buffer-reuse-window t) (View-quit)) (message "Evaluation error: %s" dbg))))) (defsubst geiser-debug--wrap-region (str) (format "(begin %s)" str)) (defun geiser-debug--unwrap (str) (if (string-match "(begin[ \t\n\v\r]+\\(.+\\)*)" str) (match-string 1 str) str)) (defun geiser-debug--send-region (compile start end and-go wrap &optional nomsg) (let* ((str (buffer-substring-no-properties start end)) (wrapped (if wrap (geiser-debug--wrap-region str) str)) (code `(,(if compile :comp :eval) (:scm ,wrapped))) (ret (geiser-eval--send/wait code)) (res (geiser-eval--retort-result-str ret nil)) (err (geiser-eval--retort-error ret))) (when and-go (funcall and-go)) (when (not err) (save-excursion (goto-char (/ (+ end start) 2)) (geiser-autodoc--clean-cache)) (unless nomsg (message "%s" res))) (geiser-debug--display-retort (geiser-syntax--scheme-str str) ret res) ret)) (defun geiser-debug--expand-region (start end all wrap) (let* ((str (buffer-substring-no-properties start end)) (wrapped (if wrap (geiser-debug--wrap-region str) str)) (code `(:eval (:ge macroexpand (quote (:scm ,wrapped)) ,(if all :t :f)))) (ret (geiser-eval--send/wait code)) (err (geiser-eval--retort-error ret)) (result (geiser-eval--retort-result ret))) (if err (geiser-debug--display-retort str ret) (geiser-debug--with-buffer (erase-buffer) (insert (format "%s" (if wrap (geiser-debug--unwrap result) result))) (goto-char (point-min))) (geiser-debug--pop-to-buffer)))) (provide 'geiser-debug) geiser-0.8.1/elisp/geiser-syntax.el0000644000175000017500000004106212607250601014161 00000000000000;;; geiser-syntax.el -- utilities for parsing scheme syntax ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Feb 08, 2009 15:03 (require 'geiser-impl) (require 'geiser-popup) (require 'geiser-base) (require 'scheme) (eval-when-compile (require 'cl)) ;;; Indentation: (defmacro geiser-syntax--scheme-indent (&rest pairs) `(progn ,@(mapcar (lambda (p) `(put ',(car p) 'scheme-indent-function ',(cadr p))) pairs))) (geiser-syntax--scheme-indent (and-let* 1) (case-lambda 0) (catch defun) (class defun) (dynamic-wind 0) (guard 1) (let*-values 1) (let-values 1) (let/ec 1) (letrec* 1) (match 1) (match-lambda 0) (match-lambda* 0) (match-let 1) (match-let* 1) (match-letrec 1) (opt-lambda 1) (parameterize 1) (parameterize* 1) (receive 2) (require-extension 0) (syntax-case 2) (test-approximate 1) (test-assert 1) (test-eq 1) (test-equal 1) (test-eqv 1) (test-group-with-cleanup 1) (test-runner-on-bad-count! 1) (test-runner-on-bad-end-name! 1) (test-runner-on-final! 1) (test-runner-on-group-begin! 1) (test-runner-on-group-end! 1) (test-runner-on-test-begin! 1) (test-runner-on-test-end! 1) (test-with-runner 1) (unless 1) (when 1) (while 1) (with-exception-handler 1) (with-syntax 1)) ;;; Extra syntax keywords (defconst geiser-syntax--builtin-keywords '("and-let*" "cut" "cute" "define-condition-type" "define-immutable-record-type" "define-record-type" "define-values" "letrec*" "match" "match-lambda" "match-lambda*" "match-let" "match-let*" "match-letrec" "parameterize" "receive" "require-extension" "set!" "syntax-case" "test-approximate" "test-assert" "test-begin" "test-end" "test-eq" "test-equal" "test-eqv" "test-error" "test-group" "test-group-with-cleanup" "test-with-runner" "unless" "when" "with-exception-handler" "with-input-from-file" "with-output-to-file")) (defun geiser-syntax--simple-keywords (keywords) "Return `font-lock-keywords' to highlight scheme KEYWORDS. KEYWORDS should be a list of strings." (when keywords `((,(format "[[(]%s\\>" (regexp-opt keywords 1)) . 1)))) (defun geiser-syntax--keywords () (append (geiser-syntax--simple-keywords geiser-syntax--builtin-keywords) `(("\\[\\(else\\)\\>" . 1) (,(rx "(" (group "define-syntax-rule") eow (* space) (? "(") (? (group (1+ word)))) (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t))))) (font-lock-add-keywords 'scheme-mode (geiser-syntax--keywords)) (geiser-impl--define-caller geiser-syntax--impl-kws keywords () "A variable (or thunk returning a value) giving additional, implementation-specific entries for font-lock-keywords.") (geiser-impl--define-caller geiser-syntax--case-sensitive case-sensitive () "A flag saying whether keywords are case sensitive.") (defun geiser-syntax--add-kws () (when (not (and (boundp 'quack-mode) quack-mode)) (let ((kw (geiser-syntax--impl-kws geiser-impl--implementation)) (cs (geiser-syntax--case-sensitive geiser-impl--implementation))) (when kw (font-lock-add-keywords nil kw)) (setq font-lock-keywords-case-fold-search (not cs))))) ;;; A simple scheme reader (defvar geiser-syntax--read/buffer-limit nil) (defsubst geiser-syntax--read/eos () (or (eobp) (and geiser-syntax--read/buffer-limit (<= geiser-syntax--read/buffer-limit (point))))) (defsubst geiser-syntax--read/next-char () (unless (geiser-syntax--read/eos) (forward-char) (char-after))) (defsubst geiser-syntax--read/token (token) (geiser-syntax--read/next-char) (if (listp token) token (list token))) (defsubst geiser-syntax--read/elisp () (ignore-errors (read (current-buffer)))) (defun geiser-syntax--read/symbol () (with-syntax-table scheme-mode-syntax-table (when (re-search-forward "\\(\\sw\\|\\s_\\)+" nil t) (make-symbol (match-string-no-properties 0))))) (defun geiser-syntax--read/matching (open close) (let ((count 1) (p (1+ (point)))) (while (and (> count 0) (geiser-syntax--read/next-char)) (cond ((looking-at-p open) (setq count (1+ count))) ((looking-at-p close) (setq count (1- count))))) (buffer-substring-no-properties p (point)))) (defsubst geiser-syntax--read/unprintable () (geiser-syntax--read/token (cons 'unprintable (geiser-syntax--read/matching "<" ">")))) (defun geiser-syntax--read/skip-comment () (while (and (geiser-syntax--read/next-char) (nth 8 (syntax-ppss)))) (geiser-syntax--read/next-token)) (defun geiser-syntax--read/next-token () (skip-syntax-forward "->") (if (geiser-syntax--read/eos) '(eob) (case (char-after) (?\; (geiser-syntax--read/skip-comment)) ((?\( ?\[) (geiser-syntax--read/token 'lparen)) ((?\) ?\]) (geiser-syntax--read/token 'rparen)) (?. (if (memq (car (syntax-after (1+ (point)))) '(0 11 12)) (geiser-syntax--read/token 'dot) (cons 'atom (geiser-syntax--read/elisp)))) (?\# (case (geiser-syntax--read/next-char) ('nil '(eob)) (?| (geiser-syntax--read/skip-comment)) (?: (if (geiser-syntax--read/next-char) (cons 'kwd (geiser-syntax--read/symbol)) '(eob))) (?\\ (cons 'char (geiser-syntax--read/elisp))) (?\( (geiser-syntax--read/token 'vectorb)) (?\< (geiser-syntax--read/unprintable)) ((?' ?` ?,) (geiser-syntax--read/next-token)) (t (let ((tok (geiser-syntax--read/symbol))) (cond ((equal (symbol-name tok) "t") '(boolean . :t)) ((equal (symbol-name tok) "f") '(boolean . :f)) (tok (cons 'atom tok)) (t (geiser-syntax--read/next-token))))))) (?\' (geiser-syntax--read/token '(quote . quote))) (?\` (geiser-syntax--read/token `(backquote . ,backquote-backquote-symbol))) (?, (if (eq (geiser-syntax--read/next-char) ?@) (geiser-syntax--read/token `(splice . ,backquote-splice-symbol)) `(unquote . ,backquote-unquote-symbol))) (?\" (cons 'string (geiser-syntax--read/elisp))) (t (cons 'atom (geiser-syntax--read/symbol)))))) (defsubst geiser-syntax--read/match (&rest tks) (let ((token (geiser-syntax--read/next-token))) (if (memq (car token) tks) token (error "Unexpected token: %s" token)))) (defsubst geiser-syntax--read/skip-until (&rest tks) (let (token) (while (and (not (memq (car token) tks)) (not (eq (car token) 'eob))) (setq token (geiser-syntax--read/next-token))) token)) (defsubst geiser-syntax--read/try (&rest tks) (let ((p (point)) (tk (ignore-errors (apply 'geiser-syntax--read/match tks)))) (unless tk (goto-char p)) tk)) (defun geiser-syntax--read/list () (cond ((geiser-syntax--read/try 'dot) (let ((tail (geiser-syntax--read))) (geiser-syntax--read/skip-until 'eob 'rparen) tail)) ((geiser-syntax--read/try 'rparen 'eob) nil) (t (cons (geiser-syntax--read) (geiser-syntax--read/list))))) (defun geiser-syntax--read () (let ((token (geiser-syntax--read/next-token)) (max-lisp-eval-depth (max max-lisp-eval-depth 3000))) (case (car token) (eob nil) (lparen (geiser-syntax--read/list)) (vectorb (apply 'vector (geiser-syntax--read/list))) ((quote backquote unquote splice) (list (cdr token) (geiser-syntax--read))) (kwd (make-symbol (format ":%s" (cdr token)))) (unprintable (format "#<%s>" (cdr token))) ((char string atom) (cdr token)) (boolean (cdr token)) (t (error "Reading scheme syntax: unexpected token: %s" token))))) (defun geiser-syntax--read-from-string (string &optional start end) (when (stringp string) (let* ((start (or start 0)) (end (or end (length string))) (max-lisp-eval-depth (min 20000 (max max-lisp-eval-depth (- end start))))) (with-temp-buffer (save-excursion (insert string)) (cons (ignore-errors (geiser-syntax--read)) (point)))))) (defun geiser-syntax--form-from-string (s) (car (geiser-syntax--read-from-string s))) (defsubst geiser-syntax--form-after-point (&optional boundary) (let ((geiser-syntax--read/buffer-limit (and (numberp boundary) boundary))) (save-excursion (values (geiser-syntax--read) (point))))) (defun geiser-syntax--mapconcat (fun lst sep) (cond ((null lst) "") ((not (listp lst)) (format ".%s%s" sep (funcall fun lst))) ((null (cdr lst)) (format "%s" (funcall fun (car lst)))) (t (format "%s%s%s" (funcall fun (car lst)) sep (geiser-syntax--mapconcat fun (cdr lst) sep))))) ;;; Code parsing: (defsubst geiser-syntax--symbol-at-point () (and (not (nth 8 (syntax-ppss))) (car (geiser-syntax--read-from-string (thing-at-point 'symbol))))) (defsubst geiser-syntax--skip-comment/string () (let ((pos (nth 8 (syntax-ppss)))) (goto-char (or pos (point))) pos)) (defsubst geiser-syntax--nesting-level () (or (nth 0 (syntax-ppss)) 0)) (defun geiser-syntax--pop-to-top () (ignore-errors (while (> (geiser-syntax--nesting-level) 0) (backward-up-list)))) (defsubst geiser-syntax--in-string-p () (nth 3 (syntax-ppss))) (defsubst geiser-syntax--pair-length (p) (if (cdr (last p)) (1+ (safe-length p)) (length p))) (defun geiser-syntax--shallow-form (boundary) (when (looking-at-p "\\s(") (save-excursion (forward-char) (let ((elems)) (ignore-errors (while (< (point) boundary) (skip-syntax-forward "-<>") (when (<= (point) boundary) (forward-sexp) (let ((s (thing-at-point 'symbol))) (unless (equal "." s) (push (car (geiser-syntax--read-from-string s)) elems)))))) (nreverse elems))))) (defsubst geiser-syntax--keywordp (s) (and s (symbolp s) (string-match "^:.+" (symbol-name s)))) (defsubst geiser-syntax--symbol-eq (s0 s1) (and (symbolp s0) (symbolp s1) (equal (symbol-name s0) (symbol-name s1)))) (defun geiser-syntax--scan-sexps (&optional begin) (let* ((fst (geiser-syntax--symbol-at-point)) (smth (or fst (not (looking-at-p "[\s \s)\s>\s<\n]")))) (path (and fst `((,fst 0))))) (save-excursion (while (> (or (geiser-syntax--nesting-level) 0) 0) (let ((boundary (point))) (geiser-syntax--skip-comment/string) (backward-up-list) (let ((form (geiser-syntax--shallow-form boundary))) (when (and (listp form) (car form) (symbolp (car form))) (let* ((len (geiser-syntax--pair-length form)) (pos (if smth (1- len) (progn (setq smth t) len))) (prev (and (> pos 1) (nth (1- pos) form))) (prev (and (geiser-syntax--keywordp prev) (list prev)))) (push `(,(car form) ,pos ,@prev) path))))))) (mapcar (lambda (e) (cons (substring-no-properties (format "%s" (car e))) (cdr e))) (nreverse path)))) (defsubst geiser-syntax--binding-form-p (bfs sbfs f) (and (symbolp f) (let ((f (symbol-name f))) (or (member f '("define" "define*" "define-syntax" "syntax-rules" "lambda" "case-lambda" "let" "let*" "let-values" "let*-values" "letrec" "letrec*" "parameterize")) (member f bfs) (member f sbfs))))) (defsubst geiser-syntax--binding-form*-p (sbfs f) (and (symbolp f) (let ((f (symbol-name f))) (or (member f '("let*" "let*-values" "letrec" "letrec*")) (member f sbfs))))) (defsubst geiser-syntax--if-symbol (x) (and (symbolp x) x)) (defsubst geiser-syntax--if-list (x) (and (listp x) x)) (defsubst geiser-syntax--normalize (vars) (mapcar (lambda (i) (let ((i (if (listp i) (car i) i))) (and (symbolp i) (symbol-name i)))) vars)) (defun geiser-syntax--linearize (form) (cond ((not (listp form)) (list form)) ((null form) nil) (t (cons (car form) (geiser-syntax--linearize (cdr form)))))) (defun geiser-syntax--scan-locals (bfs sbfs form nesting locals) (if (or (null form) (not (listp form))) (geiser-syntax--normalize locals) (if (not (geiser-syntax--binding-form-p bfs sbfs (car form))) (geiser-syntax--scan-locals bfs sbfs (car (last form)) (1- nesting) locals) (let* ((head (car form)) (name (geiser-syntax--if-symbol (cadr form))) (names (if name (geiser-syntax--if-list (caddr form)) (geiser-syntax--if-list (cadr form)))) (bns (and name (geiser-syntax--binding-form-p bfs sbfs (car names)))) (rest (if (and name (not bns)) (cdddr form) (cddr form))) (use-names (and (or rest (< nesting 1) (geiser-syntax--binding-form*-p sbfs head)) (not bns)))) (when name (push name locals)) (when (geiser-syntax--symbol-eq head 'case-lambda) (dolist (n (and (> nesting 0) (caar (last form)))) (when n (push n locals))) (setq rest (and (> nesting 0) (cdr form))) (setq use-names nil)) (when (geiser-syntax--symbol-eq head 'syntax-rules) (dolist (n (and (> nesting 0) (cdaar (last form)))) (when n (push n locals))) (setq rest (and (> nesting 0) (cdr form)))) (when use-names (dolist (n (geiser-syntax--linearize names)) (let ((xs (if (and (listp n) (listp (car n))) (car n) (list n)))) (dolist (x xs) (when x (push x locals)))))) (dolist (f (butlast rest)) (when (and (listp f) (geiser-syntax--symbol-eq (car f) 'define) (cadr f)) (push (cadr f) locals))) (geiser-syntax--scan-locals bfs sbfs (car (last (or rest names))) (1- nesting) locals))))) (defun geiser-syntax--locals-around-point (bfs sbfs) (when (eq major-mode 'scheme-mode) (save-excursion (let ((sym (unless (geiser-syntax--skip-comment/string) (thing-at-point 'symbol)))) (skip-syntax-forward "->") (let ((boundary (point)) (nesting (geiser-syntax--nesting-level))) (geiser-syntax--pop-to-top) (multiple-value-bind (form end) (geiser-syntax--form-after-point boundary) (delete sym (geiser-syntax--scan-locals bfs sbfs form (1- nesting) '())))))))) ;;; Display and fontify strings as Scheme code: (defun geiser-syntax--display (a) (cond ((null a) "()") ((eq a :t) "#t") ((eq a :f) "#f") ((geiser-syntax--keywordp a) (format "#%s" a)) ((symbolp a) (format "%s" a)) ((equal a "...") "...") ((stringp a) (format "%S" a)) ((and (listp a) (symbolp (car a)) (equal (symbol-name (car a)) "quote")) (format "'%s" (geiser-syntax--display (cadr a)))) ((listp a) (format "(%s)" (geiser-syntax--mapconcat 'geiser-syntax--display a " "))) (t (format "%s" a)))) (defun geiser-syntax--font-lock-buffer () (let ((name " *geiser font lock*")) (or (get-buffer name) (let ((buffer (get-buffer-create name))) (set-buffer buffer) (let ((geiser-default-implementation (or geiser-default-implementation (car geiser-active-implementations)))) (scheme-mode)) buffer)))) (defun geiser-syntax--scheme-str (str) (save-current-buffer (set-buffer (geiser-syntax--font-lock-buffer)) (erase-buffer) (insert str) (let ((font-lock-verbose nil)) (if (fboundp 'font-lock-ensure) (font-lock-ensure) (with-no-warnings (font-lock-fontify-buffer)))) (buffer-string))) (provide 'geiser-syntax) geiser-0.8.1/elisp/geiser-compile.el0000644000175000017500000000467012104607554014274 00000000000000;; geiser-compile.el -- compile/load scheme files ;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Wed Feb 11, 2009 00:16 (require 'geiser-debug) (require 'geiser-autodoc) (require 'geiser-eval) (require 'geiser-base) ;;; Auxiliary functions: (defun geiser-compile--buffer/path (&optional path) (let ((path (or path (read-file-name "Scheme file: " nil nil t)))) (let ((buffer (find-file-noselect path))) (when (and (buffer-modified-p buffer) (y-or-n-p "Save buffer? ")) (save-buffer buffer)) (cons buffer path)))) (defun geiser-compile--display-result (title ret) (if (not (geiser-eval--retort-error ret)) (message "%s done" title) (message "")) (geiser-debug--display-retort title ret)) (defun geiser-compile--file-op (path compile-p msg) (let* ((b/p (geiser-compile--buffer/path path)) (buffer (car b/p)) (path (cdr b/p)) (msg (format "%s %s ..." msg path))) (message msg) (geiser-autodoc--clean-cache) (geiser-compile--display-result msg (geiser-eval--send/wait `(,(if compile-p :comp-file :load-file) ,path))))) ;;; User commands: (defun geiser-compile-file (path) "Compile and load Scheme file." (interactive "FScheme file: ") (geiser-compile--file-op path t "Compiling")) (defun geiser-compile-current-buffer () "Compile and load current Scheme file." (interactive) (geiser-compile-file (buffer-file-name (current-buffer)))) (defun geiser-load-file (path) "Load Scheme file." (interactive "FScheme file: ") (geiser-compile--file-op path nil "Loading")) (defun geiser-load-current-buffer () "Load current Scheme file." (interactive) (geiser-load-file (buffer-file-name (current-buffer)))) (defun geiser-add-to-load-path (path) "Add a new directory to running Scheme's load path. When called interactively, this function will ask for the path to add, defaulting to the current buffer's directory." (interactive "DDirectory to add: ") (let* ((c `(:eval (:ge add-to-load-path ,(expand-file-name path)))) (r (geiser-eval--send/result c))) (message "%s" (if r "Added" "Failed!")))) (provide 'geiser-compile) geiser-0.8.1/elisp/geiser-popup.el0000644000175000017500000000451112164354704014003 00000000000000;; geiser-popup.el -- popup windows ;; Copyright (C) 2009, 2010, 2012, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 07, 2009 14:05 (require 'view) ;;; Support for defining popup buffers and accessors: (defvar geiser-popup--registry nil) (defvar geiser-popup--overriding-map (let ((map (make-sparse-keymap))) (define-key map "q" 'View-quit) map)) (defun geiser-popup--setup-view-mode () (view-mode t) (set (make-local-variable 'view-no-disable-on-exit) t) (set (make-local-variable 'minor-mode-overriding-map-alist) (list (cons 'view-mode geiser-popup--overriding-map))) (setq view-exit-action (lambda (buffer) (with-current-buffer buffer (bury-buffer))))) (defmacro geiser-popup--define (base name mode) (let ((get-buff (intern (format "geiser-%s--buffer" base))) (pop-buff (intern (format "geiser-%s--pop-to-buffer" base))) (with-macro (intern (format "geiser-%s--with-buffer" base))) (method (make-symbol "method")) (buffer (make-symbol "buffer"))) `(progn (add-to-list 'geiser-popup--registry ,name) (defun ,get-buff () (or (get-buffer ,name) (with-current-buffer (get-buffer-create ,name) (funcall ',mode) (geiser-popup--setup-view-mode) (current-buffer)))) (defun ,pop-buff (&optional ,method) (let ((,buffer (funcall ',get-buff))) (unless (eq ,buffer (current-buffer)) (cond ((eq ,method 'buffer) (view-buffer ,buffer)) ((eq ,method 'frame) (view-buffer-other-frame ,buffer)) (t (view-buffer-other-window ,buffer)))))) (defmacro ,with-macro (&rest body) (list 'with-current-buffer (list ',get-buff) (cons 'let (cons '((inhibit-read-only t)) body)))) (put ',with-macro 'lisp-indent-function 'defun)))) (put 'geiser-popup--define 'lisp-indent-function 1) ;;; Reload support: (defun geiser-popup-unload-function () (dolist (name geiser-popup--registry) (when (buffer-live-p (get-buffer name)) (kill-buffer name)))) (provide 'geiser-popup) geiser-0.8.1/elisp/geiser-chicken.el0000644000175000017500000002460212604324655014250 00000000000000;; geiser-chicken.el -- chicken's implementation of the geiser protocols ;; Copyright (C) 2014, 2015 Daniel Leslie ;; Based on geiser-guile.el by Jose Antonio Ortego Ruize ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Mar 08, 2009 23:03 (require 'geiser-connection) (require 'geiser-syntax) (require 'geiser-custom) (require 'geiser-base) (require 'geiser-eval) (require 'geiser-edit) (require 'geiser-log) (require 'geiser) (require 'compile) (require 'info-look) (eval-when-compile (require 'cl)) (defconst geiser-chicken-builtin-keywords '("assume" "compiler-typecase" "cond-expand" "condition-case" "declare" "define-constant" "define-inline" "define-interface" "define-record" "define-specialization" "define-type" "dotimes" "ecase" "fluid-let" "foreign-lambda" "foreign-lambda*" "foreign-primitive" "foreign-safe-lambda" "foreign-safe-lambda*" "functor" "handle-exceptions" "let-location" "let-optionals" "let-optionals*" "letrec-values" "module" "regex-case" "select" "use" "with-input-from-pipe")) ;;; Customization: (defgroup geiser-chicken nil "Customization for Geiser's Chicken flavour." :group 'geiser) (geiser-custom--defcustom geiser-chicken-prefix-delimiters '("^:" "^#") "Regex to match symbol prefix delimiters." :type '(repeat string) :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-binary (cond ((eq system-type 'windows-nt) '("csi.exe" "-:c")) ((eq system-type 'darwin) "csi") (t "csi")) "Name to use to call the Chicken executable when starting a REPL." :type '(choice string (repeat string)) :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-load-path nil "A list of paths to be added to Chicken's load path when it's started." :type '(repeat file) :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-compile-geiser-p t "Non-nil means that the Geiser runtime will be compiled on load." :type 'boolean :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-init-file "~/.chicken-geiser" "Initialization file with user code for the Chicken REPL. If all you want is to load ~/.csirc, set `geiser-chicken-load-init-file-p' instead." :type 'string :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-load-init-file-p nil "Whether to load ~/.chicken when starting Chicken. Note that, due to peculiarities in the way Chicken loads its init file, using `geiser-chicken-init-file' is not equivalent to setting this variable to t." :type 'boolean :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-extra-keywords nil "Extra keywords highlighted in Chicken scheme buffers." :type '(repeat string) :group 'geiser-chicken) (geiser-custom--defcustom geiser-chicken-case-sensitive-p t "Non-nil means keyword highlighting is case-sensitive." :type 'boolean :group 'geiser-chicken) ;;; REPL support: (defun geiser-chicken--binary () (if (listp geiser-chicken-binary) (car geiser-chicken-binary) geiser-chicken-binary)) (defun geiser-chicken--parameters () "Return a list with all parameters needed to start Chicken. This function uses `geiser-chicken-init-file' if it exists." (let ((init-file (and (stringp geiser-chicken-init-file) (expand-file-name geiser-chicken-init-file))) (n-flags (and (not geiser-chicken-load-init-file-p) '("-n")))) `(,@(and (listp geiser-chicken-binary) (cdr geiser-chicken-binary)) ,@n-flags "-include-path" ,(expand-file-name "chicken/" geiser-scheme-dir) ,@(apply 'append (mapcar (lambda (p) (list "-include-path" p)) geiser-chicken-load-path)) ,@(and init-file (file-readable-p init-file) (list init-file))))) (defconst geiser-chicken--prompt-regexp "#[^;]*;[^:0-9]*:?[0-9]+> ") ;;; Evaluation support: (defun geiser-chicken--geiser-procedure (proc &rest args) (case proc ((eval compile) (let ((form (mapconcat 'identity (cdr args) " "))) (format "(geiser-eval %s '%s)" (or (car args) "#f") form))) ((load-file compile-file) (format "(geiser-load-file %s)" (car args))) ((no-values) "(geiser-no-values)") (t (let ((form (mapconcat 'identity args " "))) (format "(geiser-%s %s)" proc form))))) (defconst geiser-chicken--module-re "( *module +\\(([^)]+)\\|[^ ]+\\)\\|( *define-library +\\(([^)]+)\\|[^ ]+\\)") (defun geiser-chicken--get-module (&optional module) (cond ((null module) (save-excursion (geiser-syntax--pop-to-top) (if (or (re-search-backward geiser-chicken--module-re nil t) (looking-at geiser-chicken--module-re) (re-search-forward geiser-chicken--module-re nil t)) (geiser-chicken--get-module (match-string-no-properties 1)) :f))) ((listp module) module) ((stringp module) (condition-case nil (car (geiser-syntax--read-from-string module)) (error :f))) (t :f))) (defun geiser-chicken--module-cmd (module fmt &optional def) (when module (let* ((module (geiser-chicken--get-module module)) (module (cond ((or (null module) (eq module :f)) def) (t (format "%s" module))))) (and module (format fmt module))))) (defun geiser-chicken--import-command (module) (geiser-chicken--module-cmd module "(use %s)")) (defun geiser-chicken--enter-command (module) (geiser-chicken--module-cmd module ",m %s" module)) (defun geiser-chicken--exit-command () ",q") (defun geiser-chicken--symbol-begin (module) (let ((distance-to-beginning-of-line (- (point) (line-beginning-position)))) (apply 'max (append (list (save-excursion (skip-syntax-backward "^'(>" distance-to-beginning-of-line) (point))) (mapcar (lambda (match-string) (save-excursion (skip-chars-backward match-string distance-to-beginning-of-line) (point))) geiser-chicken-prefix-delimiters))))) ;;; Error display (defun geiser-chicken--display-error (module key msg) (newline) (when (stringp msg) (save-excursion (insert msg)) (geiser-edit--buttonize-files)) (and (not key) msg (not (zerop (length msg))))) ;;; Trying to ascertain whether a buffer is Chicken Scheme: (defconst geiser-chicken--guess-re (regexp-opt (append '("csi" "chicken") geiser-chicken-builtin-keywords))) (defun geiser-chicken--guess () (save-excursion (goto-char (point-min)) (re-search-forward geiser-chicken--guess-re nil t))) (defun geiser-chicken--external-help (id module) "Loads chicken doc into a buffer" (browse-url (format "http://api.call-cc.org/cdoc?q=%s&query-name=Look+up" id))) ;;; Keywords and syntax (defun geiser-chicken--keywords () (append (geiser-syntax--simple-keywords geiser-chicken-extra-keywords) (geiser-syntax--simple-keywords geiser-chicken-builtin-keywords))) (geiser-syntax--scheme-indent (assume 1) (compiler-typecase 1) (cond-expand 0) (condition-case 1) (cut 1) (cute 1) (declare 0) (dotimes 1) (ecase 1) (fluid-let 1) (foreign-lambda 2) (foreign-lambda* 2) (foreign-primitive 2) (foreign-safe-lambda 2) (foreign-safe-lambda* 2) (functor 3) (handle-exceptions 2) (import 0) (let-location 1) (let-optionals 2) (let-optionals* 2) (letrec-values 1) (module 2) (regex-case 1) (select 1) (set! 1) (use 0) (with-input-from-pipe 1) (with-output-to-pipe 1)) ;;; REPL startup (defconst geiser-chicken-minimum-version "4.8.0.0") (defun geiser-chicken--version (binary) (shell-command-to-string (format "%s -e \"(display (chicken-version))\"" binary))) (defun connect-to-chicken () "Start a Chicken REPL connected to a remote process." (interactive) (geiser-connect 'chicken)) (defun geiser-chicken--compile-or-load (force-load) (let ((target (expand-file-name "chicken/geiser/emacs.so" geiser-scheme-dir)) (source (expand-file-name "chicken/geiser/emacs.scm" geiser-scheme-dir)) (force-load (or force-load (eq system-type 'windows-nt))) (suppression-prefix "(define geiser-stdout (current-output-port))(current-output-port (make-output-port (lambda a #f) (lambda a #f)))") (suppression-postfix "(current-output-port geiser-stdout)")) (let ((load-sequence (cond (force-load (format "(load \"%s\")\n(import geiser)\n" source)) ((file-exists-p target) (format "%s(load \"%s\")(import geiser)%s\n" suppression-prefix target suppression-postfix)) (t (format "%s(use utils)(compile-file \"%s\" options: '(\"-O3\" \"-s\") output-file: \"%s\" load: #t)(import geiser)%s\n" suppression-prefix source target suppression-postfix))))) (geiser-eval--send/wait load-sequence)))) (defun geiser-chicken--startup (remote) (compilation-setup t) (geiser-chicken--compile-or-load (not geiser-chicken-compile-geiser-p))) ;;; Implementation definition: (define-geiser-implementation chicken (unsupported-procedures '(callers callees generic-methods)) (binary geiser-chicken--binary) (arglist geiser-chicken--parameters) (version-command geiser-chicken--version) (minimum-version geiser-chicken-minimum-version) (repl-startup geiser-chicken--startup) (prompt-regexp geiser-chicken--prompt-regexp) (debugger-prompt-regexp nil) (enter-debugger nil) (marshall-procedure geiser-chicken--geiser-procedure) (find-module geiser-chicken--get-module) (enter-command geiser-chicken--enter-command) (exit-command geiser-chicken--exit-command) (import-command geiser-chicken--import-command) (find-symbol-begin geiser-chicken--symbol-begin) (display-error geiser-chicken--display-error) (external-help geiser-chicken--external-help) (check-buffer geiser-chicken--guess) (keywords geiser-chicken--keywords) (case-sensitive geiser-chicken-case-sensitive-p)) (geiser-impl--add-to-alist 'regexp "\\.scm$" 'chicken t) (geiser-impl--add-to-alist 'regexp "\\.release-info$" 'chicken t) (geiser-impl--add-to-alist 'regexp "\\.meta$" 'chicken t) (geiser-impl--add-to-alist 'regexp "\\.setup$" 'chicken t) (provide 'geiser-chicken) geiser-0.8.1/elisp/geiser-completion.el0000644000175000017500000001556512077522637015031 00000000000000;;; geiser-completion.el -- tab completion ;; Copyright (C) 2009, 2010, 2011, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Feb 09, 2009 22:21 (require 'geiser-impl) (require 'geiser-eval) (require 'geiser-log) (require 'geiser-syntax) (require 'geiser-base) (require 'comint) (require 'minibuffer) ;;; Minibuffer maps: (defvar geiser-completion--minibuffer-map (let ((map (make-keymap))) (set-keymap-parent map minibuffer-local-completion-map) (define-key map "?" 'self-insert-command) map)) (defvar geiser-completion--module-minibuffer-map (let ((map (make-keymap))) (set-keymap-parent map minibuffer-local-completion-map) (define-key map " " 'self-insert-command) (define-key map "?" 'self-insert-command) map)) ;;; Completion functionality: (defvar geiser-completion--binding-forms nil) (geiser-impl--register-local-variable 'geiser-completion--binding-forms 'binding-forms nil "A list of forms introducing local bindings, a la let or lambda.") (defvar geiser-completion--binding-forms* nil) (geiser-impl--register-local-variable 'geiser-completion--binding-forms* 'binding-forms* nil "A list of forms introducing nested local bindings, a la let*.") (defsubst geiser-completion--locals () (geiser-syntax--locals-around-point geiser-completion--binding-forms geiser-completion--binding-forms*)) (defun geiser-completion--symbol-list (prefix) (geiser--del-dups (append (all-completions prefix (geiser-completion--locals)) (geiser-eval--send/result `(:eval (:ge completions ,prefix)))))) (defsubst geiser-completion--module-list (prefix) (geiser-eval--send/result `(:eval (:ge module-completions ,prefix)))) (defvar geiser-completion--symbol-list-func (completion-table-dynamic 'geiser-completion--symbol-list)) (defvar geiser-completion--module-list-func (completion-table-dynamic 'geiser-completion--module-list)) (defun geiser-completion--complete (prefix modules) (if modules (geiser-completion--module-list prefix) (geiser-completion--symbol-list prefix))) (defvar geiser-completion--symbol-history nil) (defun geiser-completion--read-symbol (prompt &optional default history) (let ((minibuffer-local-completion-map geiser-completion--minibuffer-map)) (make-symbol (completing-read prompt geiser-completion--symbol-list-func nil nil nil (or history geiser-completion--symbol-history) (or default (geiser--symbol-at-point)))))) (defvar geiser-completion--module-history nil) (defun geiser-completion--read-module (&optional prompt default history) (let ((minibuffer-local-completion-map geiser-completion--module-minibuffer-map)) (completing-read (or prompt "Module name: ") geiser-completion--module-list-func nil nil nil (or history geiser-completion--module-history) default))) (defvar geiser-completion--symbol-begin-function nil) (defun geiser-completion--def-symbol-begin (module) (save-excursion (skip-syntax-backward "^-()>") (point))) (geiser-impl--register-local-method 'geiser-completion--symbol-begin-function 'find-symbol-begin 'geiser-completion--def-symbol-begin "An optional function finding the position of the beginning of the identifier around point. Takes a boolean, indicating whether we're looking for a module name.") (defun geiser-completion--symbol-begin (module) (funcall geiser-completion--symbol-begin-function module)) (defun geiser-completion--module-at-point () (save-excursion (goto-char (geiser-completion--symbol-begin t)) (ignore-errors (thing-at-point 'sexp)))) (defsubst geiser-completion--prefix (module) (buffer-substring-no-properties (geiser-completion--symbol-begin module) (point))) (defsubst geiser-completion--prefix-end (beg mod) (unless (or (eq beg (point-max)) (member (char-syntax (char-after beg)) (if mod '(?\" ?\)) '(?\" ?\( ?\))))) (let ((pos (point))) (condition-case nil (save-excursion (goto-char beg) (forward-sexp 1) (when (>= (point) pos) (point))) (scan-error pos))))) (defun geiser-completion--thing-at-point (module &optional predicate) (with-syntax-table scheme-mode-syntax-table (let* ((beg (geiser-completion--symbol-begin module)) (end (or (geiser-completion--prefix-end beg module) beg)) (prefix (and (> end beg) (buffer-substring-no-properties beg end))) (prefix (and prefix (if (string-match "\\([^-]+\\)-" prefix) (match-string 1 prefix) prefix))) (cmps (and prefix (geiser-completion--complete prefix module)))) (and cmps (list beg end cmps))))) (defun geiser-completion--for-symbol (&optional predicate) (geiser-completion--thing-at-point nil predicate)) (defun geiser-completion--for-module (&optional predicate) (geiser-completion--thing-at-point t predicate)) (defun geiser-completion--for-filename () (when (geiser-syntax--in-string-p) (let ((comint-completion-addsuffix "\"")) (comint-dynamic-complete-filename)))) (defun geiser-completion--setup (enable) (set (make-local-variable 'completion-at-point-functions) (if enable '(geiser-completion--for-symbol geiser-completion--for-module geiser-completion--for-filename) (default-value 'completion-at-point-functions)))) (defun geiser-completion--complete-module () "Complete module name at point." (interactive) (let ((completion-at-point-functions '(geiser-completion--for-module))) (call-interactively 'completion-at-point))) ;;; Smart tab mode: (make-variable-buffer-local (defvar geiser-smart-tab-mode-string " SmartTab" "Modeline indicator for geiser-smart-tab-mode")) (define-minor-mode geiser-smart-tab-mode "Toggle smart tab mode. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off the mode. When this mode is enable, TAB will indent if at point is at beginning of line or after a white space or closing parenthesis, and will try completing symbol at point otherwise." :init-value nil :lighter geiser-smart-tab-mode-string :group 'geiser-mode (set (make-local-variable 'tab-always-indent) (if geiser-smart-tab-mode 'complete (default-value 'tab-always-indent)))) (provide 'geiser-completion) geiser-0.8.1/elisp/geiser-xref.el0000644000175000017500000001307612035425712013605 00000000000000;; geiser-xref.el -- utilities for cross-referencing ;; Copyright (C) 2009, 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Thu Mar 05, 2009 23:03 (require' geiser-edit) (require 'geiser-autodoc) (require 'geiser-eval) (require 'geiser-popup) (require 'geiser-custom) (require 'geiser-base) (require 'button) (require 'lisp-mode) ;;; Customization: (defgroup geiser-xref nil "Options for cross-referencing commands." :group 'geiser) (geiser-edit--define-custom-visit geiser-xref-follow-link-method geiser-xref "How to visit buffers when following xrefs.") (geiser-custom--defface xref-link 'link geiser-xref "links in cross-reference buffers") (geiser-custom--defface xref-header 'bold geiser-xref "headers in cross-reference buffers") ;;; Ref button: (define-button-type 'geiser-xref--button 'action 'geiser-xref--button-action 'face 'geiser-font-lock-xref-link 'follow-link t) (defun geiser-xref--button-action (button) (let ((location (button-get button 'location)) (name (button-get button 'name))) (when location (geiser-edit--try-edit-location name location geiser-xref-follow-link-method)))) (defun geiser-xref--insert-button (xref) (let* ((location (cdr (assoc "location" xref))) (file (geiser-edit--location-file location)) (signature (cdr (assoc "signature" xref))) (signature-txt (and signature (geiser-autodoc--str* signature))) (module (cdr (assoc "module" xref))) (p (point))) (when signature (insert " - ") (if (stringp file) (insert-text-button signature-txt :type 'geiser-xref--button 'location location 'name (car signature) 'help-echo (format "%s in %s" (car signature) file)) (insert (format "%s" signature-txt))) (fill-region p (point)) (save-excursion (goto-char p) (indent-sexp)) (newline)))) (defun geiser-xref--module< (xr1 xr2) (let ((m1 (format "%s" (cdr (assoc "module" xr1)))) (m2 (format "%s" (cdr (assoc "module" xr2))))) (cond ((equal m1 m2) (string< (format "%s" (cdr (assoc "signature" xr1))) (format "%s" (cdr (assoc "signature" xr2))))) ((null m1) (not m2)) ((null m2)) (t (string< (format "%s" m1) (format "%s" m2)))))) (defun geiser-xref--display-xrefs (header xrefs) (geiser-xref--with-buffer (erase-buffer) (geiser--insert-with-face header 'geiser-font-lock-xref-header) (newline) (let ((last-module)) (dolist (xref (sort xrefs 'geiser-xref--module<)) (let ((module (format "%s" (cdr (assoc "module" xref))))) (when (not (equal module last-module)) (insert "\n In module ") (geiser--insert-with-face (format "%s" module) 'geiser-font-lock-xref-header) (newline 2) (setq last-module module)) (geiser-xref--insert-button xref))))) (geiser-xref--pop-to-buffer) (goto-char (point-min))) (defun geiser-xref--read-name (ask prompt) (let ((name (or (and (not ask) (geiser--symbol-at-point)) (read-string prompt nil nil (geiser--symbol-at-point))))) (and name (format "%s" name)))) (defun geiser-xref--fetch-xrefs (ask kind rkind proc) (let* ((name (geiser-xref--read-name ask (format "%s: " (capitalize kind)))) (res (and name (geiser-eval--send/result `(:eval (:ge ,proc (quote (:scm ,name)))))))) (message "Retrieving %ss list for '%s'..." rkind name) (if (or (not res) (not (listp res))) (message "No %ss found for '%s'" rkind name) (message "") (geiser-xref--display-xrefs (format "%ss for '%s'" (capitalize rkind) name) res)))) ;;; Buffer and mode: (geiser-popup--define xref "*Geiser xref*" geiser-xref-mode) (defvar geiser-xref-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (set-keymap-parent map button-buffer-map) map)) (defun geiser-xref-mode () "Major mode for displaying cross-references. \\{geiser-xref-mode-map}" (interactive) (kill-all-local-variables) (buffer-disable-undo) (use-local-map geiser-xref-mode-map) (set-syntax-table scheme-mode-syntax-table) (setq mode-name "Geiser Xref") (setq major-mode 'geiser-xref-mode) (setq buffer-read-only t)) ;;; Commands: (defun geiser-xref-generic-methods (&optional arg) "Display information about known methods of a given generic. With prefix, ask for the name of the generic." (interactive "P") (geiser-xref--fetch-xrefs arg "generic" "method" 'generic-methods)) (defun geiser-xref-callers (&optional arg) "Display list of callers for procedure at point. With prefix, ask for the procedure." (interactive "P") (geiser-xref--fetch-xrefs arg "procedure" "caller" 'callers)) (defun geiser-xref-callees (&optional arg) "Display list of callees for procedure at point. With prefix, ask for the procedure." (interactive "P") (geiser-xref--fetch-xrefs arg "procedure" "callee" 'callees)) (provide 'geiser-xref) geiser-0.8.1/elisp/geiser-repl.el0000644000175000017500000007733712606701425013617 00000000000000;;; geiser-repl.el --- Geiser's REPL ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . (require 'geiser-company) (require 'geiser-doc) (require 'geiser-autodoc) (require 'geiser-edit) (require 'geiser-completion) (require 'geiser-syntax) (require 'geiser-impl) (require 'geiser-eval) (require 'geiser-connection) (require 'geiser-menu) (require 'geiser-image) (require 'geiser-custom) (require 'geiser-base) (require 'comint) (require 'compile) (require 'scheme) ;;; Customization: (defgroup geiser-repl nil "Interacting with the Geiser REPL." :group 'geiser) (geiser-custom--defcustom geiser-repl-buffer-name-function 'geiser-repl-buffer-name "Function used to define the name of a REPL buffer. The function is called with a single argument - an implementation symbol (e.g., `guile', `chicken', etc.)." :type '(choice (function-item geiser-repl-buffer-name) (function :tag "Other function")) :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-use-other-window t "Whether to Use a window other than the current buffer's when switching to the Geiser REPL buffer." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-window-allow-split t "Whether to allow window splitting when switching to the Geiser REPL buffer." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-history-filename (expand-file-name "~/.geiser_history") "File where REPL input history is saved, so that it persists between sessions. This is actually the base name: the concrete Scheme implementation name gets appended to it." :type 'filename :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-history-size comint-input-ring-size "Maximum size of the saved REPL input history." :type 'integer :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-history-no-dups-p t "Whether to skip duplicates when recording history." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-save-debugging-history-p nil "Whether to skip debugging input in REPL history. By default, REPL interactions while scheme is in the debugger are not added to the REPL command history. Set this variable to t to change that." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-autodoc-p t "Whether to enable `geiser-autodoc-mode' in the REPL by default." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-company-p t "Whether to use company-mode for completion, if available." :group 'geiser-mode :type 'boolean) (geiser-custom--defcustom geiser-repl-read-only-prompt-p t "Whether the REPL's prompt should be read-only." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-auto-indent-p t "Whether newlines for incomplete sexps are autoindented." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-forget-old-errors-p t "Whether to forget old errors upon entering a new expression. When on (the default), every time a new expression is entered in the REPL old error messages are flushed, and using \\[next-error] afterwards will jump only to error locations produced by the new expression, if any." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-skip-version-check-p nil "Whether to skip version checks for the Scheme executable. When set, Geiser won't check the version of the Scheme interpreter when starting a REPL, saving a few tenths of a second. " :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-query-on-exit-p nil "Whether to prompt for confirmation on \\[geiser-repl-exit]." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-query-on-kill-p t "Whether to prompt for confirmation when killing a REPL buffer with a life process." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-default-host "localhost" "Default host when connecting to remote REPLs." :type 'string :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-default-port 37146 "Default port for connecting to remote REPLs." :type 'integer :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-startup-time 10000 "Time, in milliseconds, to wait for Racket to startup. If you have a slow system, try to increase this time." :type 'integer :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-inline-images-p t "Whether to display inline images in the REPL." :type 'boolean :group 'geiser-repl) (geiser-custom--defcustom geiser-repl-auto-display-images-p t "Whether to automatically invoke the external viewer to display images popping up in the REPL. See also `geiser-debug-auto-display-images-p'." :type 'boolean :group 'geiser-repl) (geiser-custom--defface repl-input 'comint-highlight-input geiser-repl "evaluated input highlighting") (geiser-custom--defface repl-prompt 'comint-highlight-prompt geiser-repl "REPL prompt") ;;; Implementation-dependent parameters (geiser-impl--define-caller geiser-repl--binary binary () "A variable or function returning the path to the scheme binary for this implementation.") (geiser-impl--define-caller geiser-repl--arglist arglist () "A function taking no arguments and returning a list of arguments to be used when invoking the scheme binary.") (geiser-impl--define-caller geiser-repl--prompt-regexp prompt-regexp () "A variable (or thunk returning a value) giving the regular expression for this implementation's geiser scheme prompt.") (geiser-impl--define-caller geiser-repl--debugger-prompt-regexp debugger-prompt-regexp () "A variable (or thunk returning a value) giving the regular expression for this implementation's debugging prompt.") (geiser-impl--define-caller geiser-repl--startup repl-startup (remote) "Function taking no parameters that is called after the REPL has been initialised. All Geiser functionality is available to you at that point.") (geiser-impl--define-caller geiser-repl--enter-cmd enter-command (module) "Function taking a module designator and returning a REPL enter module command as a string") (geiser-impl--define-caller geiser-repl--import-cmd import-command (module) "Function taking a module designator and returning a REPL import module command as a string") (geiser-impl--define-caller geiser-repl--exit-cmd exit-command () "Function returning the REPL exit command as a string") (geiser-impl--define-caller geiser-repl--version version-command (binary) "Function returning the version of the corresponding scheme process, given its full path.") (geiser-impl--define-caller geiser-repl--min-version minimum-version () "A variable providing the minimum required scheme version, as a string.") ;;; Geiser REPL buffers and processes: (defvar geiser-repl--repls nil) (defvar geiser-repl--closed-repls nil) (make-variable-buffer-local (defvar geiser-repl--repl nil)) (defsubst geiser-repl--set-this-buffer-repl (r) (setq geiser-repl--repl r)) (defun geiser-repl--live-p () (and geiser-repl--repl (get-buffer-process geiser-repl--repl))) (defun geiser-repl--repl/impl (impl &optional repls) (catch 'repl (dolist (repl (or repls geiser-repl--repls)) (when (buffer-live-p repl) (with-current-buffer repl (when (eq geiser-impl--implementation impl) (throw 'repl repl))))))) (defun geiser-repl--set-up-repl (impl) (or (and (not impl) geiser-repl--repl) (setq geiser-repl--repl (let ((impl (or impl geiser-impl--implementation (geiser-impl--guess)))) (when impl (geiser-repl--repl/impl impl)))))) (defun geiser-repl--active-impls () (let ((act)) (dolist (repl geiser-repl--repls act) (with-current-buffer repl (add-to-list 'act geiser-impl--implementation))))) (defsubst geiser-repl--repl-name (impl) (format "%s REPL" (geiser-impl--impl-str impl))) (defsubst geiser-repl--buffer-name (impl) (funcall geiser-repl-buffer-name-function impl)) (defun geiser-repl-buffer-name (impl) "Return default name of the REPL buffer for implementation IMPL." (format "* %s *" (geiser-repl--repl-name impl))) (defun geiser-repl--switch-to-buffer (buffer) (unless (eq buffer (current-buffer)) (let ((pop-up-windows geiser-repl-window-allow-split)) (if geiser-repl-use-other-window (switch-to-buffer-other-window buffer) (switch-to-buffer buffer))))) (defun geiser-repl--to-repl-buffer (impl) (unless (and (eq major-mode 'geiser-repl-mode) (eq geiser-impl--implementation impl) (not (get-buffer-process (current-buffer)))) (let* ((old (geiser-repl--repl/impl impl geiser-repl--closed-repls)) (old (and (buffer-live-p old) (not (get-buffer-process old)) old))) (geiser-repl--switch-to-buffer (or old (generate-new-buffer (geiser-repl--buffer-name impl)))) (unless old (geiser-repl-mode) (geiser-impl--set-buffer-implementation impl))))) (defun geiser-repl--read-impl (prompt &optional active) (geiser-impl--read-impl prompt (and active (geiser-repl--active-impls)))) (defsubst geiser-repl--only-impl-p () (and (null (cdr geiser-active-implementations)) (car geiser-active-implementations))) (defun geiser-repl--get-impl (prompt) (or (geiser-repl--only-impl-p) (and (eq major-mode 'geiser-repl-mode) geiser-impl--implementation) (geiser-repl--read-impl prompt))) ;;; Prompt &co. (defun geiser-repl--last-prompt-end () (cond ((and (boundp 'comint-last-prompt) (markerp (cdr comint-last-prompt))) (marker-position (cdr comint-last-prompt))) ((and (boundp 'comint-last-prompt-overlay) comint-last-prompt-overlay) (overlay-end comint-last-prompt-overlay)) (t (save-excursion (geiser-repl--bol) (+ 1 (point)))))) (defun geiser-repl--last-prompt-start () (cond ((and (boundp 'comint-last-prompt) (markerp (car comint-last-prompt))) (marker-position (car comint-last-prompt))) ((and (boundp 'comint-last-prompt-overlay) comint-last-prompt-overlay) (overlay-start comint-last-prompt-overlay)) (t (save-excursion (geiser-repl--bol) (point))))) ;;; REPL connections (make-variable-buffer-local (defvar geiser-repl--address nil)) (make-variable-buffer-local (defvar geiser-repl--connection nil)) (defun geiser-repl--remote-p () geiser-repl--address) (defsubst geiser-repl--host () (car geiser-repl--address)) (defsubst geiser-repl--port () (cdr geiser-repl--address)) (defun geiser-repl--read-address (&optional host port) (let ((defhost (or (geiser-repl--host) geiser-repl-default-host)) (defport (or (geiser-repl--port) geiser-repl-default-port))) (cons (or host (read-string (format "Host (default %s): " defhost) nil nil defhost)) (or port (read-number "Port: " defport))))) (defun geiser-repl--autodoc-mode (n) (when (or geiser-repl-autodoc-p (< n 0)) (geiser--save-msg (geiser-autodoc-mode n)))) (defun geiser-repl--save-remote-data (address) (setq geiser-repl--address address) (setq header-line-format (cond ((consp address) (format "Host: %s Port: %s" (geiser-repl--host) (geiser-repl--port))) ((stringp address) (format "Socket: %s" address)) (t nil)))) (defun geiser-repl--output-filter (txt) (geiser-con--connection-update-debugging geiser-repl--connection txt) (geiser-image--replace-images geiser-repl-inline-images-p geiser-repl-auto-display-images-p) (when (string-match-p (geiser-con--connection-prompt geiser-repl--connection) txt) (geiser-autodoc--disinhibit-autodoc))) (defun geiser-repl--check-version (impl) (when (not geiser-repl-skip-version-check-p) (let ((v (geiser-repl--version impl (geiser-repl--binary impl))) (r (geiser-repl--min-version impl))) (when (and v r (geiser--version< v r)) (error "Geiser requires %s version %s but detected %s" impl r v))))) (defun geiser-repl--start-repl (impl address) (message "Starting Geiser REPL for %s ..." impl) (when (not address) (geiser-repl--check-version impl)) (geiser-repl--to-repl-buffer impl) (sit-for 0) (goto-char (point-max)) (geiser-repl--autodoc-mode -1) (let* ((prompt-rx (geiser-repl--prompt-regexp impl)) (deb-prompt-rx (geiser-repl--debugger-prompt-regexp impl)) (prompt (geiser-con--combined-prompt prompt-rx deb-prompt-rx))) (unless prompt-rx (error "Sorry, I don't know how to start a REPL for %s" impl)) (geiser-repl--save-remote-data address) (geiser-repl--start-scheme impl address prompt) (geiser-repl--quit-setup) (geiser-repl--history-setup) (add-to-list 'geiser-repl--repls (current-buffer)) (geiser-repl--set-this-buffer-repl (current-buffer)) (setq geiser-repl--connection (geiser-con--make-connection (get-buffer-process (current-buffer)) prompt-rx deb-prompt-rx)) (geiser-repl--startup impl address) (geiser-repl--autodoc-mode 1) (geiser-company--setup geiser-repl-company-p) (add-hook 'comint-output-filter-functions 'geiser-repl--output-filter nil t) (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) geiser-repl-query-on-kill-p) (message "%s up and running!" (geiser-repl--repl-name impl)))) (defun geiser-repl--start-scheme (impl address prompt) (setq comint-prompt-regexp prompt) (let* ((name (geiser-repl--repl-name impl)) (buff (current-buffer)) (args (cond ((consp address) (list address)) ((stringp address) '(())) (t `(,(geiser-repl--binary impl) nil ,@(geiser-repl--arglist impl)))))) (condition-case err (if (and address (stringp address)) ;; Connect over a Unix-domain socket. (let ((proc (make-network-process :name (buffer-name buff) :buffer buff :family 'local :remote address))) ;; brittleness warning: this is stuff ;; make-comint-in-buffer sets up, via comint-exec, when ;; it creates its own process, something we're doing ;; here by ourselves. (set-process-filter proc 'comint-output-filter) (goto-char (point-max)) (set-marker (process-mark proc) (point))) (apply 'make-comint-in-buffer `(,name ,buff ,@args))) (error (insert "Unable to start REPL:\n" (error-message-string err) "\n") (error "Couldn't start Geiser: %s" err))) (geiser-repl--wait-for-prompt geiser-repl-startup-time))) (defun geiser-repl--wait-for-prompt (timeout) (let ((p (point)) (seen) (buffer (current-buffer))) (while (and (not seen) (> timeout 0) (get-buffer-process buffer)) (sleep-for 0.1) (setq timeout (- timeout 100)) (goto-char p) (setq seen (re-search-forward comint-prompt-regexp nil t))) (goto-char (point-max)) (unless seen (error "%s" "No prompt found!")))) (defun geiser-repl--is-debugging () (let ((dp (geiser-con--connection-debug-prompt geiser-repl--connection))) (and dp (save-excursion (goto-char (geiser-repl--last-prompt-start)) (re-search-forward dp (geiser-repl--last-prompt-end) t))))) (defun geiser-repl--connection* () (let ((buffer (geiser-repl--set-up-repl geiser-impl--implementation))) (and (buffer-live-p buffer) (get-buffer-process buffer) (with-current-buffer buffer geiser-repl--connection)))) (defun geiser-repl--connection () (or (geiser-repl--connection*) (error "No Geiser REPL for this buffer (try M-x run-geiser)"))) (setq geiser-eval--default-connection-function 'geiser-repl--connection) (defun geiser-repl--prepare-send () (geiser-image--clean-cache) (geiser-autodoc--inhibit-autodoc) (geiser-con--connection-deactivate geiser-repl--connection)) (defun geiser-repl--send (cmd &optional save-history) "Send CMD input string to the current REPL buffer. If SAVE-HISTORY is non-nil, save CMD in the REPL history." (when (and cmd (eq major-mode 'geiser-repl-mode)) (geiser-repl--prepare-send) (goto-char (point-max)) (comint-kill-input) (insert cmd) (let ((comint-input-filter (if save-history comint-input-filter 'ignore))) (comint-send-input nil t)))) (defun geiser-repl-interrupt () (interactive) (when (get-buffer-process (current-buffer)) (interrupt-process nil comint-ptyp))) ;;; REPL history (defconst geiser-repl--history-separator "\n}{\n") (defsubst geiser-repl--history-file () (format "%s.%s" geiser-repl-history-filename geiser-impl--implementation)) (defun geiser-repl--read-input-ring () (let ((comint-input-ring-file-name (geiser-repl--history-file)) (comint-input-ring-separator geiser-repl--history-separator) (buffer-file-coding-system 'utf-8)) (comint-read-input-ring t))) (defun geiser-repl--write-input-ring () (let ((comint-input-ring-file-name (geiser-repl--history-file)) (comint-input-ring-separator geiser-repl--history-separator) (buffer-file-coding-system 'utf-8)) (comint-write-input-ring))) (defun geiser-repl--history-setup () (set (make-local-variable 'comint-input-ring-size) geiser-repl-history-size) (set (make-local-variable 'comint-input-filter) 'geiser-repl--input-filter) (geiser-repl--read-input-ring)) ;;; Cleaning up (defun geiser-repl--on-quit () (geiser-repl--write-input-ring) (let ((cb (current-buffer)) (impl geiser-impl--implementation) (comint-prompt-read-only nil)) (geiser-con--connection-deactivate geiser-repl--connection t) (geiser-con--connection-close geiser-repl--connection) (setq geiser-repl--repls (remove cb geiser-repl--repls)) (dolist (buffer (buffer-list)) (when (buffer-live-p buffer) (with-current-buffer buffer (when (and (eq geiser-impl--implementation impl) (equal cb geiser-repl--repl)) (geiser-repl--set-up-repl geiser-impl--implementation))))))) (defun geiser-repl--sentinel (proc event) (let ((pb (process-buffer proc))) (when (buffer-live-p pb) (with-current-buffer pb (let ((comint-prompt-read-only nil) (comint-input-ring-file-name (geiser-repl--history-file)) (comint-input-ring-separator geiser-repl--history-separator)) (geiser-repl--on-quit) (push pb geiser-repl--closed-repls) (goto-char (point-max)) (comint-kill-region comint-last-input-start (point)) (insert "\nIt's been nice interacting with you!\n") (insert "Press C-c C-z to bring me back.\n" )))))) (defun geiser-repl--on-kill () (geiser-repl--on-quit) (setq geiser-repl--closed-repls (remove (current-buffer) geiser-repl--closed-repls))) (defun geiser-repl--input-filter (str) (not (or (and (not geiser-repl-save-debugging-history-p) (geiser-repl--is-debugging)) (string-match "^\\s *$" str) (string-match "^,quit *$" str)))) (defun geiser-repl--old-input () (save-excursion (let ((end (point))) (backward-sexp) (buffer-substring (point) end)))) (defun geiser-repl--quit-setup () (add-hook 'kill-buffer-hook 'geiser-repl--on-kill nil t) (set-process-sentinel (get-buffer-process (current-buffer)) 'geiser-repl--sentinel)) ;;; geiser-repl mode: (defun geiser-repl--bol () (interactive) (when (= (point) (comint-bol)) (beginning-of-line))) (defun geiser-repl--beginning-of-defun () (save-restriction (narrow-to-region (geiser-repl--last-prompt-end) (point)) (let ((beginning-of-defun-function nil)) (beginning-of-defun)))) (defun geiser-repl--module-function (&optional module) (if (and module geiser-eval--get-impl-module) (funcall geiser-eval--get-impl-module module) :f)) (defun geiser-repl--doc-module () (interactive) (let ((geiser-eval--get-module-function (geiser-impl--method 'find-module geiser-impl--implementation))) (geiser-doc-module))) (defun geiser-repl--newline-and-indent () (interactive) (save-restriction (narrow-to-region comint-last-input-start (point-max)) (insert "\n") (lisp-indent-line))) (defun geiser-repl--nesting-level () (save-restriction (narrow-to-region (geiser-repl--last-prompt-end) (point-max)) (geiser-syntax--nesting-level))) (defun geiser-repl--mark-input-bounds (beg end) (add-text-properties beg end '(field t))) (defun geiser-repl--is-history-input () (get-text-property (if (eolp) (save-excursion (comint-bol)) (point)) 'field)) (defun geiser-repl--grab-input () (let ((pos (comint-bol))) (goto-char (point-max)) (insert (field-string-no-properties pos)))) (defun geiser-repl--send-input () (let* ((proc (get-buffer-process (current-buffer))) (pmark (and proc (process-mark proc))) (intxt (and pmark (buffer-substring pmark (point)))) (eob (point-max))) (when intxt (and geiser-repl-forget-old-errors-p (not (geiser-repl--is-debugging)) (compilation-forget-errors)) (geiser-repl--prepare-send) (geiser-repl--mark-input-bounds pmark eob) (comint-send-input) (when (string-match "^\\s-*$" intxt) (comint-send-string proc (geiser-eval--scheme-str '(:ge no-values))) (comint-send-string proc "\n"))))) (defun geiser-repl--maybe-send () (interactive) (let ((p (point))) (cond ((< p (geiser-repl--last-prompt-start)) (if (geiser-repl--is-history-input) (geiser-repl--grab-input) (ignore-errors (compile-goto-error)))) ((let ((inhibit-field-text-motion t)) (end-of-line) (<= (geiser-repl--nesting-level) 0)) (geiser-repl--send-input)) (t (goto-char p) (if geiser-repl-auto-indent-p (geiser-repl--newline-and-indent) (insert "\n")))))) (defun geiser-repl-tab-dwim (n) "If we're after the last prompt, complete symbol or indent (if there's no symbol at point). Otherwise, go to next error in the REPL buffer." (interactive "p") (if (>= (point) (geiser-repl--last-prompt-end)) (or (completion-at-point) (lisp-indent-line)) (compilation-next-error n))) (defun geiser-repl--previous-error (n) "Go to previous error in the REPL buffer." (interactive "p") (compilation-next-error (- n))) (defun geiser-repl-clear-buffer () "Delete the output generated by the scheme process." (interactive) (let ((inhibit-read-only t)) (delete-region (point-min) (geiser-repl--last-prompt-start)) (when (< (point) (geiser-repl--last-prompt-end)) (goto-char (geiser-repl--last-prompt-end))) (recenter t))) (define-derived-mode geiser-repl-mode comint-mode "REPL" "Major mode for interacting with an inferior scheme repl process. \\{geiser-repl-mode-map}" (scheme-mode-variables) (set (make-local-variable 'face-remapping-alist) '((comint-highlight-prompt geiser-font-lock-repl-prompt) (comint-highlight-input geiser-font-lock-repl-input))) (set (make-local-variable 'mode-line-process) nil) (set (make-local-variable 'comint-use-prompt-regexp) t) (set (make-local-variable 'comint-prompt-read-only) geiser-repl-read-only-prompt-p) (setq comint-process-echoes nil) (set (make-local-variable 'beginning-of-defun-function) 'geiser-repl--beginning-of-defun) (set (make-local-variable 'comint-input-ignoredups) geiser-repl-history-no-dups-p) (setq geiser-eval--get-module-function 'geiser-repl--module-function) (geiser-completion--setup t) (setq geiser-smart-tab-mode-string "") (geiser-smart-tab-mode t) (geiser-syntax--add-kws) ;; enabling compilation-shell-minor-mode without the annoying highlighter (compilation-setup t)) (define-key geiser-repl-mode-map "\C-d" 'delete-char) (define-key geiser-repl-mode-map "\C-m" 'geiser-repl--maybe-send) (define-key geiser-repl-mode-map [return] 'geiser-repl--maybe-send) (define-key geiser-repl-mode-map "\C-j" 'geiser-repl--newline-and-indent) (define-key geiser-repl-mode-map (kbd "TAB") 'geiser-repl-tab-dwim) (define-key geiser-repl-mode-map [backtab] 'geiser-repl--previous-error) (define-key geiser-repl-mode-map "\C-a" 'geiser-repl--bol) (define-key geiser-repl-mode-map (kbd "") 'geiser-repl--bol) (geiser-menu--defmenu repl geiser-repl-mode-map ("Complete symbol" ((kbd "M-TAB")) completion-at-point :enable (geiser--symbol-at-point)) ("Complete module name" ((kbd "C-.") (kbd "M-`")) geiser-completion--complete-module :enable (geiser--symbol-at-point)) ("Edit symbol" "\M-." geiser-edit-symbol-at-point :enable (geiser--symbol-at-point)) -- ("Switch to module..." "\C-c\C-m" switch-to-geiser-module) ("Import module..." "\C-c\C-i" geiser-repl-import-module) ("Add to load path..." "\C-c\C-r" geiser-add-to-load-path) -- ("Previous matching input" "\M-p" comint-previous-matching-input-from-input "Previous input matching current") ("Next matching input" "\M-n" comint-next-matching-input-from-input "Next input matching current") ("Previous input" "\C-c\M-p" comint-previous-input) ("Next input" "\C-c\M-n" comint-next-input) -- ("Interrupt evaluation" ("\C-c\C-k" "\C-c\C-c" "\C-ck") geiser-repl-interrupt) -- (mode "Autodoc mode" ("\C-c\C-da" "\C-c\C-d\C-a") geiser-autodoc-mode) ("Symbol documentation" ("\C-c\C-dd" "\C-c\C-d\C-d") geiser-doc-symbol-at-point "Documentation for symbol at point" :enable (geiser--symbol-at-point)) ("Lookup symbol in manul" ("\C-c\C-di" "\C-c\C-d\C-i") geiser-doc-look-up-manual "Documentation for symbol at point" :enable (geiser--symbol-at-point)) ("Module documentation" ("\C-c\C-dm" "\C-c\C-d\C-m") geiser-repl--doc-module "Documentation for module at point" :enable (geiser--symbol-at-point)) -- ("Clear buffer" "\C-c\M-o" geiser-repl-clear-buffer "Clean up REPL buffer, leaving just a lonely prompt") ("Kill Scheme interpreter" "\C-c\C-q" geiser-repl-exit :enable (geiser-repl--live-p)) ("Restart" "\C-c\C-z" switch-to-geiser :enable (not (geiser-repl--live-p))) -- (custom "REPL options" geiser-repl)) (define-key geiser-repl-mode-map [menu-bar completion] 'undefined) ;;; User commands (defun run-geiser (impl) "Start a new Geiser REPL." (interactive (list (geiser-repl--get-impl "Start Geiser for scheme implementation: "))) (let ((buffer (current-buffer))) (geiser-repl--start-repl impl nil) (geiser-repl--maybe-remember-scm-buffer buffer))) (defalias 'geiser 'run-geiser) (defun geiser-connect (impl &optional host port) "Start a new Geiser REPL connected to a remote Scheme process." (interactive (list (geiser-repl--get-impl "Connect to Scheme implementation: "))) (let ((buffer (current-buffer))) (geiser-repl--start-repl impl (geiser-repl--read-address host port)) (geiser-repl--maybe-remember-scm-buffer buffer))) (defun geiser-connect-local (impl &optional socket) "Start a new Geiser REPL connected to a remote Scheme process over a Unix-domain socket." (interactive (list (geiser-repl--get-impl "Connect to Scheme implementation: "))) (let ((buffer (current-buffer))) (geiser-repl--start-repl impl (read-file-name "Socket file name: ")) (geiser-repl--maybe-remember-scm-buffer buffer))) (make-variable-buffer-local (defvar geiser-repl--last-scm-buffer nil)) (defun geiser-repl--maybe-remember-scm-buffer (buffer) (when (and buffer (eq 'scheme-mode (with-current-buffer buffer major-mode)) (eq major-mode 'geiser-repl-mode)) (setq geiser-repl--last-scm-buffer buffer))) (defun switch-to-geiser (&optional ask impl buffer) "Switch to running Geiser REPL. With prefix argument, ask for which one if more than one is running. If no REPL is running, execute `run-geiser' to start a fresh one." (interactive "P") (let* ((impl (or impl geiser-impl--implementation)) (in-repl (eq major-mode 'geiser-repl-mode)) (in-live-repl (and in-repl (get-buffer-process (current-buffer)))) (repl (cond ((and (not ask) (not impl) (not in-repl) (or geiser-repl--repl (car geiser-repl--repls)))) ((and (not ask) (not in-repl) impl (geiser-repl--repl/impl impl)))))) (cond ((or in-live-repl (and (eq (current-buffer) repl) (not (eq repl buffer)))) (when (buffer-live-p geiser-repl--last-scm-buffer) (geiser-repl--switch-to-buffer geiser-repl--last-scm-buffer))) (repl (geiser-repl--switch-to-buffer repl)) ((geiser-repl--remote-p) (geiser-connect impl)) (impl (run-geiser impl)) (t (call-interactively 'run-geiser))) (geiser-repl--maybe-remember-scm-buffer buffer))) (defun switch-to-geiser-module (&optional module buffer) "Switch to running Geiser REPL and try to enter a given module." (interactive) (let* ((module (or module (geiser-completion--read-module "Switch to module (default top-level): "))) (cmd (and module (geiser-repl--enter-cmd geiser-impl--implementation module)))) (unless (eq major-mode 'geiser-repl-mode) (switch-to-geiser nil nil (or buffer (current-buffer)))) (geiser-repl--send cmd))) (defun geiser-repl-import-module (&optional module) "Import a given module in the current namespace of the REPL." (interactive) (let* ((module (or module (geiser-completion--read-module "Import module: "))) (cmd (and module (geiser-repl--import-cmd geiser-impl--implementation module)))) (switch-to-geiser nil nil (current-buffer)) (geiser-repl--send cmd))) (defun geiser-repl-exit (&optional arg) "Exit the current REPL. With a prefix argument, force exit by killing the scheme process." (interactive "P") (when (or (not geiser-repl-query-on-exit-p) (y-or-n-p "Really quit this REPL? ")) (geiser-con--connection-deactivate geiser-repl--connection t) (let ((cmd (and (not arg) (geiser-repl--exit-cmd geiser-impl--implementation)))) (if cmd (when (stringp cmd) (geiser-repl--send cmd)) (comint-kill-subjob))))) ;;; Unload: (defun geiser-repl--repl-list () (let (lst) (dolist (repl geiser-repl--repls lst) (when (buffer-live-p repl) (with-current-buffer repl (push (cons geiser-impl--implementation geiser-repl--address) lst)))))) (defun geiser-repl--restore (impls) (dolist (impl impls) (when impl (condition-case err (geiser-repl--start-repl (car impl) (cdr impl)) (error (message (error-message-string err))))))) (defun geiser-repl-unload-function () (dolist (repl geiser-repl--repls) (when (buffer-live-p repl) (with-current-buffer repl (let ((geiser-repl-query-on-exit-p nil)) (geiser-repl-exit)) (sit-for 0.05) (kill-buffer))))) (provide 'geiser-repl) ;;; Initialization: ;; After providing 'geiser-repl, so that impls can use us. (mapc 'geiser-impl--load-impl geiser-active-implementations) geiser-0.8.1/elisp/geiser-base.el0000644000175000017500000000502412563407776013565 00000000000000;;; geiser-base.el --- shared bits ;; Copyright (C) 2009, 2010, 2012, 2013, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Settings and vars shared by all geiser modules, including little ;; utilities and emacsen compatibility bits. ;;; Emacs compatibility: (require 'ring) (eval-after-load "ring" '(when (not (fboundp 'ring-member)) (defun ring-member (ring item) (catch 'found (dotimes (ind (ring-length ring) nil) (when (equal item (ring-ref ring ind)) (throw 'found ind))))))) (when (not (fboundp 'looking-at-p)) (defsubst looking-at-p (regexp) (let ((inhibit-changing-match-data t)) (looking-at regexp)))) ;;; Utilities: (defsubst geiser--chomp (str) (if (string-match-p ".*\n$" str) (substring str 0 -1) str)) (defun geiser--shorten-str (str len &optional sep) (let ((str-len (length str))) (if (<= str-len len) str (let* ((sep (or sep " ... ")) (sep-len (length sep)) (prefix-len (/ (- str-len sep-len) 2)) (prefix (substring str 0 prefix-len)) (suffix (substring str (- str-len prefix-len)))) (format "%s%s%s" prefix sep suffix))))) (defun geiser--region-to-string (begin &optional end) (let ((end (or end (point)))) (when (< begin end) (let* ((str (buffer-substring-no-properties begin end)) (pieces (split-string str nil t))) (mapconcat 'identity pieces " "))))) (defun geiser--insert-with-face (str face) (let ((p (point))) (insert str) (put-text-property p (point) 'face face))) (defmacro geiser--save-msg (&rest body) (let ((msg (make-symbol "msg"))) `(let ((,msg (current-message))) ,@body (message ,msg)))) (put 'geiser--save-msg 'lisp-indent-function 0) (defun geiser--del-dups (lst) (let (result) (dolist (e lst (nreverse result)) (unless (member e result) (push e result))))) (defsubst geiser--symbol-at-point () (let ((thing (thing-at-point 'symbol))) (and thing (make-symbol thing)))) (defun geiser--cut-version (v) (when (string-match "\\([0-9]+\\(?:\\.[0-9]+\\)*\\).*" v) (match-string 1 v))) (defun geiser--version< (v1 v2) (let ((v1 (geiser--cut-version v1)) (v2 (geiser--cut-version v2))) (and v1 v2 (version< v1 v2)))) (provide 'geiser-base) geiser-0.8.1/elisp/geiser-company.el0000644000175000017500000001111712466000452014277 00000000000000;; geiser-company.el -- integration with company-mode ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Aug 24, 2009 12:44 (require 'geiser-autodoc) (require 'geiser-completion) (require 'geiser-edit) (require 'geiser-base) (require 'geiser-doc) (eval-when-compile (require 'cl)) ;;; Helpers: (make-variable-buffer-local (defvar geiser-company--enabled-flag nil)) (make-variable-buffer-local (defvar geiser-company--autodoc-flag nil)) (make-variable-buffer-local (defvar geiser-company--completions nil)) (defun geiser-company--candidates (prefix) (and (equal prefix (car geiser-company--completions)) (cdr geiser-company--completions))) (defun geiser-company--doc (id) (ignore-errors (when (not (geiser-autodoc--inhibit)) (let ((help (geiser-autodoc--autodoc `((,id 0))))) (and help (substring-no-properties help)))))) (defun geiser-company--doc-buffer (id) (let* ((impl geiser-impl--implementation) (module (geiser-doc-module (geiser-eval--get-module) impl)) (symbol (make-symbol id)) (ds (geiser-doc--get-docstring symbol module))) (if (or (not ds) (not (listp ds))) (message "No documentation available for '%s'" symbol) (with-current-buffer (get-buffer-create "*company-documentation*") (geiser-doc--render-docstring ds symbol module impl) (current-buffer))))) (defun geiser-company--location (id) (ignore-errors (when (not (geiser-autodoc--inhibit)) (let ((id (make-symbol id))) (condition-case nil (geiser-edit-module id 'noselect) (error (geiser-edit-symbol id 'noselect))))))) (defun geiser-company--prefix-at-point () (when (and (not (geiser-autodoc--inhibit)) geiser-company--enabled-flag) (if (nth 8 (syntax-ppss)) 'stop (let* ((prefix (and (looking-at-p "\\_>") (geiser-completion--prefix nil))) (cmps1 (and prefix (geiser-completion--complete prefix nil))) (cmps2 (and prefix (geiser-completion--complete prefix t))) (mprefix (and (not cmps1) (not cmps2) (geiser-completion--prefix t))) (cmps3 (and mprefix (geiser-completion--complete mprefix t))) (cmps (or cmps3 (append cmps1 cmps2))) (prefix (or mprefix prefix))) (setq geiser-company--completions (cons prefix cmps)) prefix)))) ;;; Activation (defun geiser-company--setup (enable) (setq geiser-company--enabled-flag enable) (when (fboundp 'geiser-company--setup-company) (geiser-company--setup-company enable))) (defun geiser-company--inhibit-autodoc (ignored) (when (setq geiser-company--autodoc-flag geiser-autodoc-mode) (geiser-autodoc-mode -1))) (defun geiser-company--restore-autodoc (&optional ignored) (when geiser-company--autodoc-flag (geiser-autodoc-mode 1))) ;;; Company activation (eval-after-load "company" '(progn (defun geiser-company-backend (command &optional arg &rest ignored) "A `company-mode' completion back-end for `geiser-mode'." (interactive (list 'interactive)) (case command ('interactive (company-begin-backend 'geiser-company-backend)) ('prefix (geiser-company--prefix-at-point)) ('candidates (geiser-company--candidates arg)) ('meta (geiser-company--doc arg)) ('doc-buffer (geiser-company--doc-buffer arg)) ('location (geiser-company--location arg)) ('sorted t))) (defun geiser-company--setup-company (enable) (set (make-local-variable 'company-default-lighter) "/C") (set (make-local-variable 'company-echo-delay) 0.01) (set (make-local-variable 'company-backends) (and enable '(geiser-company-backend))) (company-mode (if enable 1 -1))) (add-hook 'company-completion-finished-hook 'geiser-company--restore-autodoc) (add-hook 'company-completion-cancelled-hook 'geiser-company--restore-autodoc) (add-hook 'company-completion-started-hook 'geiser-company--inhibit-autodoc) (define-key company-active-map (kbd "M-`") (lambda () (interactive) (company-cancel) (call-interactively 'geiser-completion--complete-module))))) (provide 'geiser-company) geiser-0.8.1/elisp/geiser-load.el.in0000644000175000017500000000034612164355221014161 00000000000000(defconst geiser-elisp-dir nil) (setq geiser-elisp-dir (file-name-directory load-file-name)) (add-to-list 'load-path geiser-elisp-dir) (require 'geiser) (setq geiser-scheme-dir "@abs_top_srcdir@/scheme") (provide 'geiser-load) geiser-0.8.1/elisp/geiser-autodoc.el0000644000175000017500000002052212544742556014306 00000000000000;; geiser-autodoc.el -- autodoc mode ;; Copyright (C) 2009, 2010, 2011, 2012, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Feb 08, 2009 19:44 (require 'geiser-eval) (require 'geiser-syntax) (require 'geiser-custom) (require 'geiser-base) (require 'eldoc) ;;; Customization: (defgroup geiser-autodoc nil "Options for displaying autodoc strings in the echo area." :group 'geiser) (geiser-custom--defface autodoc-current-arg 'font-lock-variable-name-face geiser-autodoc "highlighting current argument in autodoc messages") (geiser-custom--defface autodoc-identifier 'font-lock-function-name-face geiser-autodoc "highlighting procedure name in autodoc messages") (geiser-custom--defcustom geiser-autodoc-delay 0.3 "Delay before autodoc messages are fetched and displayed, in seconds." :type 'number :group 'geiser-autodoc) (geiser-custom--defcustom geiser-autodoc-display-module-p t "Whether to display procedure module in autodoc strings." :type 'boolean :group 'geiser-autodoc) (geiser-custom--defcustom geiser-autodoc-identifier-format "%s:%s" "Format for displaying module and procedure or variable name, in that order, when `geiser-autodoc-display-module-p' is on." :type 'string :group 'geiser-autodoc) ;;; Procedure arguments: (make-variable-buffer-local (defvar geiser-autodoc--cached-signatures nil)) (defsubst geiser-autodoc--clean-cache () (setq geiser-autodoc--cached-signatures nil)) (defun geiser-autodoc--show-signatures (ret) (let ((res (geiser-eval--retort-result ret)) (signs)) (when res (dolist (item res) (push (cons (format "%s" (car item)) (cdr item)) signs)) (let ((str (geiser-autodoc--autodoc (geiser-syntax--scan-sexps) signs))) (when (not (string-equal str eldoc-last-message)) (eldoc-message str))) (setq geiser-autodoc--cached-signatures signs)))) (defun geiser-autodoc--get-signatures (funs) (when funs (let ((m (format "'(%s)" (mapconcat 'identity funs " ")))) (geiser-eval--send `(:eval (:ge autodoc (:scm ,m))) 'geiser-autodoc--show-signatures))) (and (or (assoc (car funs) geiser-autodoc--cached-signatures) (assoc (cadr funs) geiser-autodoc--cached-signatures)) geiser-autodoc--cached-signatures)) (defun geiser-autodoc--sanitize-args (args) (cond ((null args) nil) ((listp args) (cons (car args) (geiser-autodoc--sanitize-args (cdr args)))) (t '("...")))) (defun geiser-autodoc--format-arg (a) (cond ((and (listp a) (geiser-syntax--keywordp (car a))) (if (and (cdr a) (listp (cdr a))) (format "(#%s %s)" (car a) (geiser-syntax--display (cadr a))) (format "(#%s)" (car a)))) (t (geiser-syntax--display a)))) (defun geiser-autodoc--insert-arg-group (args current &optional pos) (when args (insert " ")) (dolist (a (geiser-autodoc--sanitize-args args)) (let ((p (point))) (insert (geiser-autodoc--format-arg a)) (when (or (and (numberp pos) (numberp current) (setq current (1+ current)) (= (1+ pos) current)) (and (geiser-syntax--keywordp current) (listp a) (geiser-syntax--symbol-eq current (car a)))) (put-text-property p (point) 'face 'geiser-font-lock-autodoc-current-arg) (setq pos nil current nil))) (insert " ")) (when args (backward-char)) current) (defun geiser-autodoc--insert-args (args pos prev) (let ((cpos 1) (reqs (cdr (assoc "required" args))) (opts (mapcar (lambda (a) (if (and (symbolp a) (not (equal (symbol-name a) "..."))) (list a) a)) (cdr (assoc "optional" args)))) (keys (cdr (assoc "key" args)))) (setq cpos (geiser-autodoc--insert-arg-group reqs cpos (and (not (zerop pos)) pos))) (setq cpos (geiser-autodoc--insert-arg-group opts cpos pos)) (geiser-autodoc--insert-arg-group keys prev nil))) (defsubst geiser-autodoc--id-name (proc module) (let ((str (if module (format geiser-autodoc-identifier-format module proc) (format "%s" proc)))) (propertize str 'face 'geiser-font-lock-autodoc-identifier))) (defun geiser-autodoc--str* (full-signature) (let ((geiser-font-lock-autodoc-current-arg 'default)) (geiser-autodoc--str (list (car full-signature)) full-signature))) (defsubst geiser-autodoc--value-str (proc module value) (let ((name (geiser-autodoc--id-name proc module))) (if value (format "%s => %s" name value) name))) (defun geiser-autodoc--str (desc signature) (let ((proc (car desc)) (args (cdr (assoc "args" signature))) (module (cdr (assoc "module" signature)))) (if (not args) (geiser-autodoc--value-str proc module (cdr (assoc "value" signature))) (save-current-buffer (set-buffer (geiser-syntax--font-lock-buffer)) (erase-buffer) (insert (format "(%s" (geiser-autodoc--id-name proc module))) (let ((pos (or (cadr desc) 0)) (prev (car (cddr desc)))) (dolist (a args) (when (not (member a (cdr (member a args)))) (geiser-autodoc--insert-args a pos prev) (insert " |")))) (delete-char -2) (insert ")") (buffer-substring (point-min) (point)))))) (defun geiser-autodoc--autodoc (path &optional signs) (let ((signs (or signs (geiser-autodoc--get-signatures (mapcar 'car path)))) (p (car path)) (s)) (while (and p (not s)) (unless (setq s (cdr (assoc (car p) signs))) (setq p (car path)) (setq path (cdr path)))) (when s (geiser-autodoc--str p s)))) ;;; Autodoc functions: (make-variable-buffer-local (defvar geiser-autodoc--inhibit-function nil)) (defsubst geiser-autodoc--inhibit () (and geiser-autodoc--inhibit-function (funcall geiser-autodoc--inhibit-function))) (defsubst geiser-autodoc--inhibit-autodoc () (setq geiser-autodoc--inhibit-function (lambda () t))) (defsubst geiser-autodoc--disinhibit-autodoc () (setq geiser-autodoc--inhibit-function nil)) (defsubst geiser-autodoc--autodoc-at-point () (geiser-autodoc--autodoc (geiser-syntax--scan-sexps))) (defun geiser-autodoc--eldoc-function () (condition-case e (and (not (geiser-autodoc--inhibit)) (geiser-autodoc--autodoc-at-point)) (error (format "Autodoc not available (%s)" (error-message-string e))))) (defun geiser-autodoc-show () "Show the signature or value of the symbol at point in the echo area." (interactive) (message (geiser-autodoc--autodoc-at-point))) ;;; Autodoc mode: (make-variable-buffer-local (defvar geiser-autodoc-mode-string " A" "Modeline indicator for geiser-autodoc-mode")) (define-minor-mode geiser-autodoc-mode "Toggle Geiser's Autodoc mode. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off the mode. When Autodoc mode is enabled, a synopsis of the word at point is displayed in the minibuffer." :init-value nil :lighter geiser-autodoc-mode-string :group 'geiser-autodoc (set (make-local-variable 'eldoc-documentation-function) (when geiser-autodoc-mode 'geiser-autodoc--eldoc-function)) (set (make-local-variable 'eldoc-minor-mode-string) nil) (set (make-local-variable 'eldoc-idle-delay) geiser-autodoc-delay) (eldoc-mode (if geiser-autodoc-mode 1 -1)) (when (called-interactively-p nil) (message "Geiser Autodoc %s" (if geiser-autodoc-mode "enabled" "disabled")))) (defadvice eldoc-display-message-no-interference-p (after geiser-autodoc--message-ok-p) (when geiser-autodoc-mode (setq ad-return-value (and ad-return-value ;; Display arglist only when the minibuffer is ;; inactive, e.g. not on `C-x C-f'. Lifted from slime. (not (active-minibuffer-window))))) ad-return-value) (provide 'geiser-autodoc) geiser-0.8.1/elisp/geiser-image.el0000644000175000017500000000777112466000452013726 00000000000000;; geiser-image.el -- support for image display ;; Copyright (c) 2012, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Authors: Michael Wilber, Jose Antonio Ortega Ruiz ;; Start date: Sun Sep 02, 2012 00:00 (require 'geiser-custom) (require 'geiser-base) (require 'geiser-impl) ;;; Customization: (defgroup geiser-image nil "Options for image displaying." :group 'geiser) (geiser-custom--defcustom geiser-image-viewer "display" "Which system image viewer program to invoke upon M-x `geiser-view-last-image'." :type 'string :group 'geiser-image) (geiser-custom--defcustom geiser-image-cache-keep-last 10 "How many images to keep in geiser's image cache." :type 'integer :group 'geiser-image) (geiser-custom--defcustom geiser-image-cache-dir nil "Default directory where generated images are stored. If nil,the system wide tmp dir will be used." :type 'path :group 'geiser-image) (geiser-custom--defface image-button 'button geiser-image "image buttons in terminal buffers") (geiser-impl--define-caller geiser-image--cache-dir image-cache-dir () "Directory where generated images are stored. If this function returns nil, no images are generated.") (defun geiser-image--list-cache () "List all the images in the image cache." (let ((cdir (geiser-image--cache-dir nil))) (and cdir (file-directory-p cdir) (let ((files (directory-files-and-attributes cdir t "geiser-img-[0-9]*.png"))) (mapcar 'car (sort files (lambda (a b) (< (float-time (nth 6 a)) (float-time (nth 6 b)))))))))) (defun geiser-image--clean-cache () "Clean all except for the last `geiser-image-cache-keep-last' images in `geiser-image--cache-dir'." (interactive) (dolist (f (butlast (geiser-image--list-cache) geiser-image-cache-keep-last)) (delete-file f))) (defun geiser-image--display (file) (start-process "Geiser image view" nil geiser-image-viewer file)) (defun geiser-image--button-action (button) (let ((file (button-get button 'geiser-image-file))) (when (file-exists-p file) (geiser-image--display file)))) (define-button-type 'geiser-image--button 'action 'geiser-image--button-action 'follow-link t) (defun geiser-image--insert-button (file) (insert-text-button "[image]" :type 'geiser-image--button 'face 'geiser-font-lock-image-button 'geiser-image-file file 'help-echo "Click to display image")) (defun geiser-image--replace-images (inline-images-p auto-p) "Replace all image patterns with actual images" (let ((seen 0)) (with-silent-modifications (save-excursion (goto-char (point-min)) (while (re-search-forward "\"?#\"?" nil t) (setq seen (+ 1 seen)) (let* ((file (match-string 1)) (begin (match-beginning 0)) (end (match-end 0))) (delete-region begin end) (goto-char begin) (if (and inline-images-p (display-images-p)) (insert-image (create-image file) "[image]") (geiser-image--insert-button file) (when auto-p (geiser-image--display file))))))) seen)) (defun geiser-view-last-image (n) "Open the last displayed image in the system's image viewer. With prefix arg, open the N-th last shown image in the system's image viewer." (interactive "p") (let ((images (reverse (geiser-image--list-cache)))) (if (>= (length images) n) (geiser-image--display (nth (- n 1) images)) (error "There aren't %d recent images" n)))) (provide 'geiser-image) geiser-0.8.1/elisp/geiser-reload.el0000644000175000017500000000501112466000452014073 00000000000000;; geiser-reload.el -- unload/load geiser packages ;; Copyright (C) 2009, 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Aug 22, 2009 23:04 (require 'geiser-repl) (require 'geiser-mode) (require 'geiser-custom) (require 'geiser-base) (require 'geiser) (require 'geiser-load nil t) (require 'geiser-install nil t) ;;; Reload: (defmacro geiser--features-list () (quote '( geiser-mode geiser-repl geiser-doc geiser-xref geiser-compile geiser-debug geiser-company geiser-edit geiser-completion geiser-autodoc geiser-eval geiser-connection geiser-syntax geiser-menu geiser-inf geiser-impl geiser-image geiser-custom geiser-log geiser-popup geiser-base geiser-version geiser-install geiser ))) (defun geiser-unload () "Unload all Geiser modules." (interactive) (let ((fs (geiser--features-list))) (unload-feature 'geiser-reload t) (dolist (f fs) (when (featurep f) (unload-feature f t))) (remove-hook 'scheme-mode-hook 'geiser-mode--maybe-activate))) (defun geiser-reload (&optional arg) "Reload Geiser. With prefix arg, prompts for the DIRECTORY from which Geiser should be loaded again." (interactive "P") (let* ((old-dir geiser-elisp-dir) (dir (or (and arg (read-directory-name "New Geiser elisp dir: " old-dir old-dir t old-dir)) old-dir))) (unless (or (file-exists-p (expand-file-name "geiser-reload.el" dir)) (file-exists-p (expand-file-name "geiser-reload.elc" dir))) (error "%s does not contain Geiser!" dir)) (let ((memo (geiser-custom--memoized-state)) (repls (geiser-repl--repl-list)) (buffers (geiser-mode--buffers))) (geiser-unload) (setq load-path (remove old-dir load-path)) (add-to-list 'load-path dir) (mapc (lambda (x) (set (car x) (cdr x))) memo) (require 'geiser-reload) (geiser-repl--restore repls) (geiser-mode--restore buffers) (message "Geiser reloaded!")))) (provide 'geiser-reload) geiser-0.8.1/elisp/Makefile.am0000644000175000017500000000160512466037500013074 00000000000000EXTRA_DIST = geiser-install.el.in geiser-load.el.in dist_lisp_LISP = \ geiser-autodoc.el \ geiser-base.el \ geiser-company.el \ geiser-compile.el \ geiser-completion.el \ geiser-connection.el \ geiser-custom.el \ geiser-debug.el \ geiser-doc.el \ geiser-edit.el \ geiser.el \ geiser-eval.el \ geiser-guile.el \ geiser-image.el \ geiser-impl.el \ geiser-log.el \ geiser-menu.el \ geiser-mode.el \ geiser-racket.el \ geiser-chicken.el \ geiser-popup.el \ geiser-reload.el \ geiser-repl.el \ geiser-syntax.el \ geiser-xref.el \ geiser-version.el lisp_LISP = geiser-install.el noinst_LISP = geiser-load.el CLEANFILES = geiser-install.el geiser-load.el geiser-install.el: $(srcdir)/geiser.el $(srcdir)/geiser-install.el.in @sed -e "s|@SCHEME_DIR[@]|$(datarootdir)/geiser|" \ $(srcdir)/geiser-install.el.in >$@ geiser-0.8.1/elisp/geiser-menu.el0000644000175000017500000001266512035425752013614 00000000000000;;; geiser-menu.el -- menu and keymaps definition ;; Copyright (c) 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Jun 12, 2010 03:01 (require 'geiser-custom) (require 'geiser-base) ;;; Customization: (geiser-custom--defcustom geiser-global-menu-always-on-p nil "Whether the Geiser menu is always visible." :type 'boolean :group 'geiser) ;;; Top-level menu (defmacro geiser-menu--add-item (keymap map kd) (cond ((or (eq '-- kd) (eq 'line kd)) `(geiser-menu--add-line ,map)) ((stringp (car kd)) `(geiser-menu--add-basic-item ,keymap ,map ,kd)) ((eq 'menu (car kd)) `(geiser-menu--add-submenu ,(cadr kd) ,keymap ,map ,(cddr kd))) ((eq 'custom (car kd)) `(geiser-menu--add-custom ,(nth 1 kd) ,(nth 2 kd) ,keymap ,map)) ((eq 'mode (car kd)) `(geiser-menu--mode-toggle ,(nth 1 kd) ,(nth 2 kd) ,(nth 3 kd) ,keymap ,map)) (t (error "Bad item form: %s" kd)))) (defmacro geiser-menu--add-basic-item (keymap map kd) (let* ((title (nth 0 kd)) (binding (nth 1 kd)) (cmd (nth 2 kd)) (hlp (nth 3 kd)) (item (make-symbol title)) (hlp (and (stringp hlp) (list :help hlp))) (rest (or (and hlp (nthcdr 4 kd)) (nthcdr 3 kd))) (binding (if (listp binding) binding (list binding)))) `(progn (define-key ,map [,item] '(menu-item ,title ,cmd ,@hlp ,@rest)) ,@(and (car binding) `((put ',cmd :advertised-binding ,(car binding)))) ,@(mapcar (lambda (b) `(define-key ,keymap ,b ',cmd)) binding)))) (defmacro geiser-menu--add-items (keymap map keys) `(progn ,@(mapcar (lambda (k) (list 'geiser-menu--add-item keymap map k)) (reverse keys)))) (defmacro geiser-menu--add-submenu (name keymap map keys) (let ((ev (make-symbol name)) (map2 (make-symbol "map2"))) `(progn (let ((,map2 (make-sparse-keymap ,name))) (define-key ,map [,ev] (cons ,name ,map2)) (geiser-menu--add-items ,keymap ,map2 ,keys))))) (defvar geiser-menu--line-counter 0) (defun geiser-menu--add-line (&optional map) (let ((line (make-symbol (format "line%s" (setq geiser-menu--line-counter (1+ geiser-menu--line-counter)))))) (define-key (or map global-map) `[,line] `(menu-item "--single-line")))) (defmacro geiser-menu--add-custom (title group keymap map) `(geiser-menu--add-item ,keymap ,map (,title nil (lambda () (interactive) (customize-group ',group))))) (defmacro geiser-menu--mode-toggle (title bindings mode keymap map) `(geiser-menu--add-item ,keymap ,map (,title ,bindings ,mode :button (:toggle . (and (boundp ',mode) ,mode))))) (defmacro geiser-menu--defmenu (name keymap &rest keys) (let ((mmap (make-symbol "mmap"))) `(progn (let ((,mmap (make-sparse-keymap "Geiser"))) (define-key ,keymap [menu-bar ,name] (cons "Geiser" ,mmap)) (define-key ,mmap [customize] (cons "Customize" geiser-menu--custom-customize)) (define-key ,mmap [switch] (cons "Switch to" geiser-menu--custom-switch)) (define-key ,mmap [Run] (cons "Run" geiser-menu--custom-run)) (geiser-menu--add-line ,mmap) (geiser-menu--add-items ,keymap ,mmap ,keys) ,mmap)))) (put 'geiser-menu--defmenu 'lisp-indent-function 2) ;;; Shared entries (defvar geiser-menu--custom-map (make-sparse-keymap "Geiser")) (defvar geiser-menu--custom-run (make-sparse-keymap "Run")) (defvar geiser-menu--custom-switch (make-sparse-keymap "Switch")) (defvar geiser-menu--custom-customize (make-sparse-keymap "Customize")) (define-key geiser-menu--custom-map [customize] (cons "Customize" geiser-menu--custom-customize)) (define-key geiser-menu--custom-map [switch] (cons "Switch to" geiser-menu--custom-switch)) (define-key geiser-menu--custom-map [run] (cons "Run" geiser-menu--custom-run)) (defun geiser-menu--add-global-custom (title group) (define-key geiser-menu--custom-customize `[,(make-symbol title)] (cons title `(lambda () (interactive) (customize-group ',group))))) (defun geiser-menu--add-impl (name runner switcher) (let ((title (capitalize (format "%s" name))) (group (intern (format "geiser-%s" name)))) (define-key geiser-menu--custom-run `[,name] `(menu-item ,title ,runner :enable (geiser-impl--active-p ',name))) (define-key geiser-menu--custom-switch `[,name] `(menu-item ,title ,switcher :enable (geiser-repl--repl/impl ',name))) (geiser-menu--add-global-custom title group))) (geiser-menu--add-global-custom "Geiser" 'geiser) (provide 'geiser-menu) geiser-0.8.1/elisp/geiser-mode.el0000644000175000017500000003276012563443162013573 00000000000000;; geiser-mode.el -- minor mode for scheme buffers ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Feb 08, 2009 15:13 (require 'geiser-repl) (require 'geiser-menu) (require 'geiser-doc) (require 'geiser-compile) (require 'geiser-completion) (require 'geiser-company) (require 'geiser-xref) (require 'geiser-edit) (require 'geiser-autodoc) (require 'geiser-debug) (require 'geiser-syntax) (require 'geiser-impl) (require 'geiser-eval) (require 'geiser-popup) (require 'geiser-custom) (require 'geiser-base) ;;; Customization: (defgroup geiser-mode nil "Mode enabling Geiser abilities in Scheme buffers &co.." :group 'geiser) (geiser-custom--defcustom geiser-mode-auto-p t "Whether `geiser-mode' should be active by default in all scheme buffers." :group 'geiser-mode :type 'boolean) (geiser-custom--defcustom geiser-mode-start-repl-p nil "Whether a REPL should be automatically started if one is not active when `geiser-mode' is activated in a buffer." :group 'geiser-mode :type 'boolean) (geiser-custom--defcustom geiser-mode-autodoc-p t "Whether `geiser-autodoc-mode' gets enabled by default in Scheme buffers." :group 'geiser-mode :group 'geiser-autodoc :type 'boolean) (geiser-custom--defcustom geiser-mode-company-p t "Whether to use company-mode for completion, if available." :group 'geiser-mode :type 'boolean) (geiser-custom--defcustom geiser-mode-smart-tab-p nil "Whether `geiser-smart-tab-mode' gets enabled by default in Scheme buffers." :group 'geiser-mode :type 'boolean) ;;; Evaluation commands: (defun geiser--go-to-repl () (switch-to-geiser nil nil (current-buffer)) (push-mark) (goto-char (point-max))) (defun geiser-eval-region (start end &optional and-go raw nomsg) "Eval the current region in the Geiser REPL. With prefix, goes to the REPL buffer afterwards (as `geiser-eval-region-and-go')" (interactive "rP") (save-restriction (narrow-to-region start end) (check-parens)) (geiser-debug--send-region nil start end (and and-go 'geiser--go-to-repl) (not raw) nomsg)) (defun geiser-eval-region-and-go (start end) "Eval the current region in the Geiser REPL and visit it afterwads." (interactive "r") (geiser-eval-region start end t)) (geiser-impl--define-caller geiser-eval--bounds eval-bounds () "A pair with the bounds of a buffer to be evaluated, defaulting to (cons (point-min) . (point-max)).") (defun geiser-eval-buffer (&optional and-go raw nomsg) "Eval the current buffer in the Geiser REPL. With prefix, goes to the REPL buffer afterwards (as `geiser-eval-buffer-and-go')" (interactive "P") (let* ((bounds (geiser-eval--bounds geiser-impl--implementation)) (from (or (car bounds) (point-min))) (to (or (cdr bounds) (point-max)))) (geiser-eval-region from to and-go raw nomsg))) (defun geiser-eval-buffer-and-go () "Eval the current buffer in the Geiser REPL and visit it afterwads." (interactive) (geiser-eval-buffer t)) (defun geiser-eval-definition (&optional and-go) "Eval the current definition in the Geiser REPL. With prefix, goes to the REPL buffer afterwards (as `geiser-eval-definition-and-go')" (interactive "P") (save-excursion (end-of-defun) (let ((end (point))) (beginning-of-defun) (geiser-eval-region (point) end and-go t)))) (defun geiser-eval-definition-and-go () "Eval the current definition in the Geiser REPL and visit it afterwads." (interactive) (geiser-eval-definition t)) (defun geiser-eval-last-sexp (print-to-buffer-p) "Eval the previous sexp in the Geiser REPL. With a prefix, print the result of the evaluation to the buffer." (interactive "P") (let* ((ret (geiser-eval-region (save-excursion (backward-sexp) (point)) (point) nil t print-to-buffer-p)) (str (geiser-eval--retort-result-str ret (when print-to-buffer-p "")))) (when (and print-to-buffer-p (not (string= "" str))) (push-mark) (insert str)))) (defun geiser-compile-definition (&optional and-go) "Compile the current definition in the Geiser REPL. With prefix, goes to the REPL buffer afterwards (as `geiser-eval-definition-and-go')" (interactive "P") (save-excursion (end-of-defun) (let ((end (point))) (beginning-of-defun) (geiser-debug--send-region t (point) end (and and-go 'geiser--go-to-repl) t)))) (defun geiser-compile-definition-and-go () "Compile the current definition in the Geiser REPL and visit it afterwads." (interactive) (geiser-compile-definition t)) (defun geiser-expand-region (start end &optional all raw) "Macro-expand the current region and display it in a buffer. With prefix, recursively macro-expand the resulting expression." (interactive "rP") (geiser-debug--expand-region start end all (not raw))) (defun geiser-expand-definition (&optional all) "Macro-expand the current definition. With prefix, recursively macro-expand the resulting expression." (interactive "P") (save-excursion (end-of-defun) (let ((end (point))) (beginning-of-defun) (geiser-expand-region (point) end all t)))) (defun geiser-expand-last-sexp (&optional all) "Macro-expand the previous sexp. With prefix, recursively macro-expand the resulting expression." (interactive "P") (geiser-expand-region (save-excursion (backward-sexp) (point)) (point) all t)) (defun geiser-set-scheme () "Associates current buffer with a given Scheme implementation." (interactive) (let ((impl (geiser-impl--read-impl))) (geiser-impl--set-buffer-implementation impl) (geiser-repl--set-up-repl impl))) (defun geiser-mode-switch-to-repl (arg) "Switches to Geiser REPL. With prefix, try to enter the current buffer's module." (interactive "P") (if arg (switch-to-geiser-module (geiser-eval--get-module) (current-buffer)) (switch-to-geiser nil nil (current-buffer)))) (defun geiser-mode-switch-to-repl-and-enter () "Switches to Geiser REPL and enters current buffer's module." (interactive) (geiser-mode-switch-to-repl t)) (defun geiser-restart-repl () "Restarts the REPL associated with the current buffer." (interactive) (let ((b (current-buffer))) (geiser-mode-switch-to-repl nil) (comint-kill-subjob) (sit-for 0.1) ;; ugly hack; but i don't care enough to fix it (call-interactively 'run-geiser) (sit-for 0.2) ;; ditto (goto-char (point-max)) (pop-to-buffer b))) (defun geiser-squarify (n) "Toggle between () and [] for current form. With numeric prefix, perform that many toggles, forward for positive values and backward for negative." (interactive "p") (let ((pared (and (boundp 'paredit-mode) paredit-mode)) (fwd (> n 0)) (steps (abs n))) (when (and pared (fboundp 'paredit-mode)) (paredit-mode -1)) (unwind-protect (save-excursion (unless (looking-at-p "\\s(") (backward-up-list)) (while (> steps 0) (let ((p (point)) (round (looking-at-p "("))) (forward-sexp) (backward-delete-char 1) (insert (if round "]" ")")) (goto-char p) (delete-char 1) (insert (if round "[" "(")) (setq steps (1- steps)) (backward-char) (condition-case nil (progn (when fwd (forward-sexp 2)) (backward-sexp)) (error (setq steps 0)))))) (when (and pared (fboundp 'paredit-mode)) (paredit-mode 1))))) (defun geiser-insert-lambda (&optional full) "Insert λ at point. With prefix, inserts (λ ())." (interactive "P") (if (not full) (insert (make-char 'greek-iso8859-7 107)) (insert "(" (make-char 'greek-iso8859-7 107) " ())") (backward-char 2))) ;;; Geiser mode: (make-variable-buffer-local (defvar geiser-mode-string nil "Modeline indicator for geiser-mode")) (defun geiser-mode--lighter () (or geiser-mode-string (format " %s" (or (geiser-impl--impl-str) "G")))) (defvar geiser-mode-map (make-sparse-keymap)) (define-minor-mode geiser-mode "Toggle Geiser's mode. With no argument, this command toggles the mode. Non-null prefix argument turns on the mode. Null prefix argument turns off the mode. When Geiser mode is enabled, a host of nice utilities for interacting with the Geiser REPL is at your disposal. \\{geiser-mode-map}" :init-value nil :lighter (:eval (geiser-mode--lighter)) :group 'geiser-mode :keymap geiser-mode-map (when geiser-mode (geiser-impl--set-buffer-implementation nil t)) (setq geiser-autodoc-mode-string "/A") (setq geiser-smart-tab-mode-string "/T") (geiser-company--setup (and geiser-mode geiser-mode-company-p)) (geiser-completion--setup geiser-mode) (when geiser-mode-autodoc-p (geiser-autodoc-mode (if geiser-mode 1 -1))) (when geiser-mode-smart-tab-p (geiser-smart-tab-mode (if geiser-mode 1 -1))) (geiser-syntax--add-kws) (when (and geiser-mode geiser-mode-start-repl-p (not (geiser-repl--connection*))) (save-window-excursion (run-geiser geiser-impl--implementation)))) (defun turn-on-geiser-mode () "Enable `geiser-mode' (in a Scheme buffer)." (interactive) (geiser-mode 1)) (defun turn-off-geiser-mode () "Disable `geiser-mode' (in a Scheme buffer)." (interactive) (geiser-mode -1)) (defun geiser-mode--maybe-activate () (when (and geiser-mode-auto-p (eq major-mode 'scheme-mode)) (turn-on-geiser-mode))) ;;; Keys: (geiser-menu--defmenu geiserm geiser-mode-map ("Eval sexp before point" "\C-x\C-e" geiser-eval-last-sexp) ("Eval definition" "\M-\C-x" geiser-eval-definition) ("Eval definition and go" "\C-c\M-e" geiser-eval-definition-and-go) ("Eval region" "\C-c\C-r" geiser-eval-region :enable mark-active) ("Eval region and go" "\C-c\M-r" geiser-eval-region-and-go geiser-eval-region :enable mark-active) ("Eval buffer" "\C-c\C-b" geiser-eval-buffer) ("Eval buffer and go" "\C-c\M-b" geiser-eval-buffer-and-go) ;; ("Compile definition" "\C-c\M-c" geiser-compile-definition) ;; ("Compile definition and go" "\C-c\C-c" geiser-compile-definition-and-go) (menu "Macroexpand" ("Sexp before point" ("\C-c\C-m\C-e" "\C-c\C-me") geiser-expand-last-sexp) ("Region" ("\C-c\C-m\C-r" "\C-c\C-mr") geiser-expand-region) ("Definition" ("\C-c\C-m\C-x" "\C-c\C-mx") geiser-expand-definition)) -- ("Symbol documentation" ("\C-c\C-d\C-d" "\C-c\C-dd") geiser-doc-symbol-at-point :enable (geiser--symbol-at-point)) ("Short symbol documentation" ("\C-c\C-d\C-s" "\C-c\C-ds") geiser-autodoc-show :enable (geiser--symbol-at-point)) ("Module documentation" ("\C-c\C-d\C-m" "\C-c\C-dm") geiser-doc-module) ("Symbol manual lookup" ("\C-c\C-d\C-i" "\C-c\C-di") geiser-doc-look-up-manual :enable (geiser-doc--manual-available-p)) (mode "Autodoc mode" ("\C-c\C-d\C-a" "\C-c\C-da") geiser-autodoc-mode) -- ("Compile buffer" "\C-c\C-k" geiser-compile-current-buffer) ("Switch to REPL" "\C-c\C-z" geiser-mode-switch-to-repl) ("Switch to REPL and enter module" "\C-c\C-a" geiser-mode-switch-to-repl-and-enter) ("Set Scheme..." "\C-c\C-s" geiser-set-scheme) -- ("Edit symbol at point" "\M-." geiser-edit-symbol-at-point :enable (geiser--symbol-at-point)) ("Go to previous definition" "\M-," geiser-pop-symbol-stack) ("Complete symbol" ((kbd "M-TAB")) completion-at-point :enable (geiser--symbol-at-point)) ("Complete module name" ((kbd "M-`") (kbd "C-.")) geiser-completion--complete-module) ("Edit module" ("\C-c\C-e\C-m" "\C-c\C-em") geiser-edit-module) ("Add to load path..." ("\C-c\C-e\C-l" "\C-c\C-el") geiser-add-to-load-path) ("Toggle ()/[]" ("\C-c\C-e\C-[" "\C-c\C-e[") geiser-squarify) ("Insert λ" ("\C-c\\" "\C-c\C-\\") geiser-insert-lambda) -- ("Callers" ((kbd "C-c <")) geiser-xref-callers :enable (and (geiser-eval--supported-p 'callers) (geiser--symbol-at-point))) ("Callees" ((kbd "C-c >")) geiser-xref-callees :enable (and (geiser-eval--supported-p 'callees) (geiser--symbol-at-point))) -- (mode "Smart TAB mode" nil geiser-smart-tab-mode) -- (custom "Customize Geiser mode" geiser-mode)) (define-key geiser-mode-map [menu-bar scheme] 'undefined) ;; (geiser-mode--triple-chord ?x ?m 'geiser-xref-generic-methods) ;;; Reload support: (defun geiser-mode--buffers () (let ((buffers)) (dolist (buffer (buffer-list)) (when (buffer-live-p buffer) (set-buffer buffer) (when geiser-mode (push (cons buffer geiser-impl--implementation) buffers)))) buffers)) (defun geiser-mode--restore (buffers) (dolist (b buffers) (when (buffer-live-p (car b)) (set-buffer (car b)) (when (cdr b) (geiser-impl--set-buffer-implementation (cdr b))) (geiser-mode 1)))) (defun geiser-mode-unload-function () (dolist (b (geiser-mode--buffers)) (with-current-buffer (car b) (geiser-mode nil)))) (provide 'geiser-mode) geiser-0.8.1/elisp/geiser-install.el.in0000644000175000017500000000012612031652606014704 00000000000000(require 'geiser) (setq geiser-scheme-dir "@SCHEME_DIR@") (provide 'geiser-install) geiser-0.8.1/elisp/geiser-version.el.in0000644000175000017500000000110712031703367014724 00000000000000;;; geiser-version.el.in -- geiser's version ;; Copyright (C) 2009 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . (defvar geiser-version-string "@PACKAGE_STRING@" "Geiser's version as a string.") (defun geiser-version () "Echoes Geiser's version." (interactive) (message "%s" geiser-version-string)) (provide 'geiser-version) geiser-0.8.1/elisp/geiser.el0000644000175000017500000000743212574057300012644 00000000000000;;; geiser.el --- GNU Emacs and Scheme talk to each other ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Autoloads and basic setup for geiser. ;;; Locations: ;;;###autoload (defconst geiser-elisp-dir (file-name-directory load-file-name) "Directory containing Geiser's Elisp files.") ;;;###autoload (defconst geiser-scheme-dir (let ((d (expand-file-name "./scheme/" geiser-elisp-dir))) (if (file-directory-p d) d (expand-file-name "../scheme/" geiser-elisp-dir))) "Directory containing Geiser's Scheme files.") ;;;###autoload (when (not (member geiser-elisp-dir load-path)) (add-to-list 'load-path geiser-elisp-dir)) ;;; Autoloads: ;;;###autoload (autoload 'geiser-version "geiser-version" "Echo Geiser's version." t) ;;;###autoload (autoload 'geiser-unload "geiser-reload" "Unload all Geiser code." t) ;;;###autoload (autoload 'geiser-reload "geiser-reload" "Reload Geiser code." t) ;;;###autoload (autoload 'geiser "geiser-repl" "Start a Geiser REPL, or switch to a running one." t) ;;;###autoload (autoload 'run-geiser "geiser-repl" "Start a Geiser REPL." t) ;;;###autoload (autoload 'geiser-connect "geiser-repl" "Start a Geiser REPL connected to a remote server." t) ;;;###autoload (autoload 'geiser-connect-local "geiser-repl" "Start a Geiser REPL connected to a remote server over a Unix-domain socket." t) ;;;###autoload (autoload 'switch-to-geiser "geiser-repl" "Switch to a running one Geiser REPL." t) ;;;###autoload (autoload 'run-guile "geiser-guile" "Start a Geiser Guile REPL." t) ;;;###autoload (autoload 'switch-to-guile "geiser-guile" "Start a Geiser Guile REPL, or switch to a running one." t) ;;;###autoload (autoload 'connect-to-guile "geiser-guile" "Connect to a remote Geiser Guile REPL." t) ;;;###autoload (autoload 'run-racket "geiser-racket" "Start a Geiser Racket REPL." t) ;;;###autoload (autoload 'run-gracket "geiser-racket" "Start a Geiser GRacket REPL." t) ;;;###autoload (autoload 'switch-to-racket "geiser-racket" "Start a Geiser Racket REPL, or switch to a running one." t) ;;;###autoload (autoload 'connect-to-racket "geiser-racket" "Connect to a remote Geiser Racket REPL." t) ;;;###autoload (autoload 'run-chicken "geiser-chicken" "Start a Geiser Chicken REPL." t) ;;;###autoload (autoload 'switch-to-chicken "geiser-chicken" "Start a Geiser Chicken REPL, or switch to a running one." t) ;;;###autoload (autoload 'connect-to-chicken "geiser-chicken" "Connect to a remote Geiser Chicken REPL." t) ;;;###autoload (autoload 'geiser-mode "geiser-mode" "Minor mode adding Geiser REPL interaction to Scheme buffers." t) ;;;###autoload (autoload 'turn-on-geiser-mode "geiser-mode" "Enable Geiser's mode (useful in Scheme buffers)." t) ;;;###autoload (autoload 'turn-off-geiser-mode "geiser-mode" "Disable Geiser's mode (useful in Scheme buffers)." t) ;;;###autoload (autoload 'geiser-mode--maybe-activate "geiser-mode") ;;;###autoload (mapc (lambda (group) (custom-add-load group (symbol-name group)) (custom-add-load 'geiser (symbol-name group))) '(geiser geiser-repl geiser-autodoc geiser-doc geiser-debug geiser-faces geiser-mode geiser-guile geiser-image geiser-racket geiser-chicken geiser-implementation geiser-xref)) ;;; Setup: ;;;###autoload (add-hook 'scheme-mode-hook 'geiser-mode--maybe-activate) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.rkt\\'" . scheme-mode)) (provide 'geiser) ;;; geiser.el ends here geiser-0.8.1/elisp/geiser-connection.el0000644000175000017500000002206112574163767015013 00000000000000;;; geiser-connection.el -- talking to a scheme process ;; Copyright (C) 2009, 2010, 2011, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 07, 2009 21:11 ;; Connection datatype and functions for managing request queues ;; between emacs and inferior guile processes. (require 'geiser-log) (require 'geiser-syntax) (require 'geiser-base) (require 'geiser-impl) (require 'tq) ;;; Buffer connections: (make-variable-buffer-local (defvar geiser-con--connection nil)) (defun geiser-con--get-connection (buffer/proc) (if (processp buffer/proc) (geiser-con--get-connection (process-buffer buffer/proc)) (with-current-buffer buffer/proc geiser-con--connection))) ;;; Request datatype: (defun geiser-con--make-request (con str cont &optional sender-buffer) (list (cons :id (geiser-con--connection-inc-count con)) (cons :string str) (cons :continuation cont) (cons :buffer (or sender-buffer (current-buffer))) (cons :connection con))) (defsubst geiser-con--request-id (req) (cdr (assoc :id req))) (defsubst geiser-con--request-string (req) (cdr (assoc :string req))) (defsubst geiser-con--request-continuation (req) (cdr (assoc :continuation req))) (defsubst geiser-con--request-buffer (req) (cdr (assoc :buffer req))) (defsubst geiser-con--request-connection (req) (cdr (assoc :connection req))) (defsubst geiser-con--request-deactivate (req) (setcdr (assoc :continuation req) nil)) (defsubst geiser-con--request-deactivated-p (req) (null (cdr (assoc :continuation req)))) ;;; Connection datatype: (defun geiser-con--tq-create (process) (let ((tq (tq-create process))) (set-process-filter process `(lambda (p s) (geiser-con--tq-filter ',tq s))) tq)) (defun geiser-con--tq-filter (tq in) (when (buffer-live-p (tq-buffer tq)) (with-current-buffer (tq-buffer tq) (if (tq-queue-empty tq) (progn (geiser-log--error "Unexpected queue input:\n %s" in) (delete-region (point-min) (point-max))) (goto-char (point-max)) (insert in) (goto-char (point-min)) (when (re-search-forward (tq-queue-head-regexp tq) nil t) (unwind-protect (funcall (tq-queue-head-fn tq) (tq-queue-head-closure tq) (buffer-substring (point-min) (point))) (delete-region (point-min) (point-max)) (tq-queue-pop tq))))))) (defun geiser-con--combined-prompt (prompt debug) (format "\\(%s%s\\)" prompt (if debug (format "\\|%s" debug) ""))) (defun geiser-con--connection-eot-re (prompt debug) (geiser-con--combined-prompt (format "\n%s" prompt) (and debug (format "\n%s" debug)))) (defun geiser-con--make-connection (proc prompt debug-prompt) (list t (cons :filter (process-filter proc)) (cons :tq (geiser-con--tq-create proc)) (cons :tq-filter (process-filter proc)) (cons :eot (geiser-con--connection-eot-re prompt debug-prompt)) (cons :prompt prompt) (cons :debug-prompt debug-prompt) (cons :is-debugging nil) (cons :count 0) (cons :completed (make-hash-table :weakness 'value)))) (defsubst geiser-con--connection-process (c) (tq-process (cdr (assoc :tq c)))) (defsubst geiser-con--connection-filter (c) (cdr (assoc :filter c))) (defsubst geiser-con--connection-tq-filter (c) (cdr (assoc :tq-filter c))) (defsubst geiser-con--connection-tq (c) (cdr (assoc :tq c))) (defsubst geiser-con--connection-eot (c) (cdr (assoc :eot c))) (defsubst geiser-con--connection-prompt (c) (cdr (assoc :prompt c))) (defsubst geiser-con--connection-debug-prompt (c) (cdr (assoc :debug-prompt c))) (defsubst geiser-con--connection-is-debugging (c) (cdr (assoc :is-debugging c))) (defsubst geiser-con--connection-set-debugging (c d) (setcdr (assoc :is-debugging c) d)) (defun geiser-con--connection-update-debugging (c txt) (let* ((dp (geiser-con--connection-debug-prompt c)) (is-d (and (stringp dp) (string-match dp txt)))) (geiser-con--connection-set-debugging c is-d) is-d)) (defsubst geiser-con--connection-completed (c r) (geiser-con--request-deactivate r) (puthash (geiser-con--request-id r) r (cdr (assoc :completed c)))) (defsubst geiser-con--connection-completed-p (c id) (gethash id (cdr (assoc :completed c)))) (defun geiser-con--connection-inc-count (c) (let* ((cnt (assoc :count c)) (new (1+ (cdr cnt)))) (setcdr cnt new) new)) (defun geiser-con--has-entered-debugger (con answer) (and (not (geiser-con--connection-is-debugging con)) (let ((p (car (last (split-string answer "\n" t))))) (and p (geiser-con--connection-update-debugging con p))))) (defun geiser-con--connection-eot-p (con txt) (and txt (string-match-p (geiser-con--connection-eot con) txt))) (defun geiser-con--connection-close (con) (let ((tq (geiser-con--connection-tq con))) (and tq (tq-close tq)))) (defvar geiser-con--startup-prompt nil) (defun geiser-con--startup-prompt (p s) (setq geiser-con--startup-prompt (concat geiser-con--startup-prompt s)) nil) (defun geiser-con--connection-deactivate (c &optional no-wait) (when (car c) (let* ((tq (geiser-con--connection-tq c)) (proc (geiser-con--connection-process c)) (proc-filter (geiser-con--connection-filter c))) (unless no-wait (while (and (not (tq-queue-empty tq)) (accept-process-output proc 0.1)))) (set-process-filter proc proc-filter) (setcar c nil)))) (defun geiser-con--connection-activate (c) (when (not (car c)) (let* ((tq (geiser-con--connection-tq c)) (proc (geiser-con--connection-process c)) (tq-filter (geiser-con--connection-tq-filter c))) (while (accept-process-output proc 0.01)) (set-process-filter proc tq-filter) (setcar c t)))) ;;; Requests handling: (defun geiser-con--req-form (req answer) (let ((con (geiser-con--request-connection req))) (if (geiser-con--has-entered-debugger con answer) `((error (key . geiser-debugger)) (output . ,answer)) (condition-case err (let ((start (string-match "((\\(?:result)?\\|error\\) " answer))) (or (and start (car (read-from-string answer start))) `((error (key . retort-syntax)) (output . ,answer)))) (error `((error (key . geiser-con-error)) (output . ,(format "%s\n(%s)" answer (error-message-string err))))))))) (defun geiser-con--process-completed-request (req answer) (let ((cont (geiser-con--request-continuation req)) (id (geiser-con--request-id req)) (rstr (geiser-con--request-string req)) (form (geiser-con--req-form req answer)) (buffer (or (geiser-con--request-buffer req) (current-buffer))) (con (geiser-con--request-connection req))) (if (not cont) (geiser-log--warn "<%s> Droping result for request %S: %s" id rstr form) (condition-case cerr (with-current-buffer buffer (funcall cont form) (geiser-log--info "<%s>: processed" id)) (error (geiser-log--error "<%s>: continuation failed %S \n\t%s" id rstr cerr)))) (geiser-con--connection-completed con req))) (defun geiser-con--connection-add-request (c r) (geiser-log--info "REQUEST: <%s>: %s" (geiser-con--request-id r) (geiser-con--request-string r)) (geiser-con--connection-activate c) (tq-enqueue (geiser-con--connection-tq c) (concat (geiser-con--request-string r) "\n") (geiser-con--connection-eot c) r 'geiser-con--process-completed-request t)) ;;; Message sending interface: (defun geiser-con--send-string (con str cont &optional sbuf) (let ((req (geiser-con--make-request con str cont sbuf))) (geiser-con--connection-add-request con req) req)) (defvar geiser-connection-timeout 30000 "Time limit, in msecs, blocking on synchronous evaluation requests") (defun geiser-con--send-string/wait (con str cont &optional timeout sbuf) (save-current-buffer (let ((proc (and con (geiser-con--connection-process con)))) (unless proc (error "Geiser connection not active")) (let* ((req (geiser-con--send-string con str cont sbuf)) (id (geiser-con--request-id req)) (timeout (/ (or timeout geiser-connection-timeout) 1000.0))) (with-timeout (timeout (geiser-con--request-deactivate req)) (condition-case nil (while (and (geiser-con--connection-process con) (not (geiser-con--connection-completed-p con id))) (accept-process-output proc (/ timeout 10))) (error (geiser-con--request-deactivate req)))))))) (provide 'geiser-connection) geiser-0.8.1/elisp/geiser-edit.el0000644000175000017500000002226312206310271013555 00000000000000;;; geiser-edit.el -- scheme edit locations ;; Copyright (C) 2009, 2010, 2012, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Wed Feb 11, 2009 21:07 (require 'geiser-completion) (require 'geiser-eval) (require 'geiser-custom) (require 'geiser-base) (require 'etags) ;;; Customization: (defmacro geiser-edit--define-custom-visit (var group doc) `(geiser-custom--defcustom ,var nil ,doc :group ',group :type '(choice (const :tag "Other window" window) (const :tag "Other frame" frame) (const :tag "Current window" nil)))) (geiser-edit--define-custom-visit geiser-edit-symbol-method geiser-mode "How the new buffer is opened when invoking \\[geiser-edit-symbol-at-point] or following links in error buffers.") (geiser-custom--defface error-link 'link geiser-debug "links in error buffers") ;;; Auxiliar functions: (defun geiser-edit--visit-file (file method) (cond ((eq method 'window) (pop-to-buffer (find-file-noselect file t))) ((eq method 'frame) (find-file-other-frame file)) ((eq method 'noselect) (find-file-noselect file t)) (t (find-file file)))) (defsubst geiser-edit--location-name (loc) (cdr (assoc "name" loc))) (defsubst geiser-edit--location-file (loc) (cdr (assoc "file" loc))) (defsubst geiser-edit--to-number (x) (cond ((numberp x) x) ((stringp x) (string-to-number x)))) (defsubst geiser-edit--location-line (loc) (geiser-edit--to-number (cdr (assoc "line" loc)))) (defsubst geiser-edit--location-column (loc) (geiser-edit--to-number (cdr (assoc "column" loc)))) (defsubst geiser-edit--make-location (name file line column) `(("name" . ,name) ("file" . ,file) ("line" . ,line) ("column" . ,column))) (defconst geiser-edit--def-re (regexp-opt '("define" "defmacro" "define-macro" "define-syntax" "define-syntax-rule" "-define-syntax" "-define" "define*" "define-method" "define-class" "define-struct"))) (defconst geiser-edit--def-re* (regexp-opt '("define-syntaxes" "define-values"))) (defsubst geiser-edit--def-re (thing) (format "(%s +(?%s\\_>" geiser-edit--def-re (regexp-quote (format "%s" thing)))) (defsubst geiser-edit--def-re* (thing) (format "(%s +([^)]*?\\_<%s\\_>" geiser-edit--def-re* (regexp-quote (format "%s" thing)))) (defsubst geiser-edit--symbol-re (thing) (format "\\_<%s\\_>" (regexp-quote (format "%s" thing)))) (defun geiser-edit--goto-line (symbol line) (goto-char (point-min)) (if (numberp line) (forward-line (max 0 (1- line))) (goto-char (point-min)) (when (or (re-search-forward (geiser-edit--def-re symbol) nil t) (re-search-forward (geiser-edit--def-re* symbol) nil t) (re-search-forward (geiser-edit--symbol-re symbol) nil t)) (goto-char (match-beginning 0))))) (defun geiser-edit--try-edit-location (symbol loc &optional method) (let ((symbol (or (geiser-edit--location-name loc) symbol)) (file (geiser-edit--location-file loc)) (line (geiser-edit--location-line loc)) (col (geiser-edit--location-column loc))) (unless file (error "Couldn't find edit location for '%s'" symbol)) (unless (file-readable-p file) (error "Couldn't open '%s' for read" file)) (geiser-edit--visit-file file (or method geiser-edit-symbol-method)) (geiser-edit--goto-line symbol line) (when col (beginning-of-line) (forward-char col)) (cons (current-buffer) (point)))) (defsubst geiser-edit--try-edit (symbol ret &optional method) (geiser-edit--try-edit-location symbol (geiser-eval--retort-result ret) method)) ;;; Links (define-button-type 'geiser-edit--button 'action 'geiser-edit--button-action 'face 'geiser-font-lock-error-link 'follow-link t) (defun geiser-edit--button-action (button) (let ((loc (button-get button 'geiser-location)) (method (button-get button 'geiser-method))) (when loc (geiser-edit--try-edit-location nil loc method)))) (defun geiser-edit--make-link (beg end file line col &optional method) (make-button beg end :type 'geiser-edit--button 'geiser-method method 'geiser-location (geiser-edit--make-location 'error file line col) 'help-echo "Go to error location")) (defconst geiser-edit--default-file-rx "^[ \t]*\\([^<>:\n\"]+\\):\\([0-9]+\\):\\([0-9]+\\)") (defun geiser-edit--buttonize-files (&optional rx no-fill) (let ((rx (or rx geiser-edit--default-file-rx)) (fill-column (- (window-width) 2))) (save-excursion (while (re-search-forward rx nil t) (geiser-edit--make-link (match-beginning 1) (match-end 1) (match-string 1) (match-string 2) (match-string 3) 'window) (unless no-fill (fill-region (match-end 0) (point-at-eol))))))) (defun geiser-edit--open-next (&optional n reset) (interactive) (let* ((n (or n 1)) (nxt (if (< n 0) 'backward-button 'forward-button)) (msg (if (< n 0) "previous" "next")) (n (abs n)) (p (point)) (found nil)) (when reset (goto-char (point-min))) (while (> n 0) (let ((b (ignore-errors (funcall nxt 1)))) (unless b (setq n 0)) (when (and b (eq (button-type b) 'geiser-edit--button)) (setq n (- n 1)) (when (<= n 0) (setq found t) (push-button (point)))))) (unless found (goto-char p) (error "No %s error" msg)))) ;;; Visibility (defun geiser-edit--cloak (form) (intern (format "geiser-edit-cloak-%s" form))) (defun geiser-edit--hide (form) (geiser-edit--show form) (let ((cloak (geiser-edit--cloak form))) (save-excursion (goto-char (point-min)) (while (re-search-forward (format "(%s\\b" form) nil t) (let* ((beg (match-beginning 0)) (end (progn (ignore-errors (goto-char beg) (forward-sexp)) (point)))) (when (> end beg) (overlay-put (make-overlay beg end) 'invisible cloak))))) (add-to-invisibility-spec (cons cloak t)))) (defun geiser-edit--show (form) (let ((cloak (geiser-edit--cloak form))) (remove-overlays nil nil 'invisible cloak) (remove-from-invisibility-spec (cons cloak t)))) (defun geiser-edit--show-all () (remove-overlays) (setq buffer-invisibility-spec '(t))) (defun geiser-edit--toggle-visibility (form) (if (and (listp buffer-invisibility-spec) (assoc (geiser-edit--cloak form) buffer-invisibility-spec)) (geiser-edit--show form) (geiser-edit--hide form))) ;;; Commands: (defvar geiser-edit--symbol-history nil) (defun geiser-edit-symbol (symbol &optional method marker) "Asks for a symbol to edit, with completion." (interactive (list (geiser-completion--read-symbol "Edit symbol: " nil geiser-edit--symbol-history))) (let ((cmd `(:eval (:ge symbol-location ',symbol)))) (geiser-edit--try-edit symbol (geiser-eval--send/wait cmd) method) (when marker (ring-insert find-tag-marker-ring marker)))) (defun geiser-edit-symbol-at-point (&optional arg) "Opens a new window visiting the definition of the symbol at point. With prefix, asks for the symbol to edit." (interactive "P") (let* ((symbol (or (and (not arg) (geiser--symbol-at-point)) (geiser-completion--read-symbol "Edit symbol: "))) (cmd `(:eval (:ge symbol-location ',symbol))) (marker (point-marker))) (condition-case err (progn (geiser-edit--try-edit symbol (geiser-eval--send/wait cmd)) (when marker (ring-insert find-tag-marker-ring marker))) (error (condition-case nil (geiser-edit-module-at-point) (error (error (error-message-string err)))))))) (defun geiser-pop-symbol-stack () "Pop back to where \\[geiser-edit-symbol-at-point] was last invoked." (interactive) (condition-case nil (pop-tag-mark) (error "No previous location for find symbol invocation"))) (defun geiser-edit-module (module &optional method) "Asks for a module and opens it in a new buffer." (interactive (list (geiser-completion--read-module))) (let ((cmd `(:eval (:ge module-location '(:module ,module))))) (geiser-edit--try-edit module (geiser-eval--send/wait cmd) method))) (defun geiser-edit-module-at-point () "Opens a new window visiting the module at point." (interactive) (let ((marker (point-marker))) (geiser-edit-module (or (geiser-completion--module-at-point) (geiser-completion--read-module))) (when marker (ring-insert find-tag-marker-ring marker)))) (provide 'geiser-edit) geiser-0.8.1/elisp/geiser-log.el0000644000175000017500000000601212035425756013422 00000000000000;; geiser-log.el -- logging utilities ;; Copyright (C) 2009, 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 07, 2009 12:07 ;; Some utilities for maintaining a simple log buffer, mainly for ;; debugging purposes. (require 'geiser-popup) (require 'geiser-base) (require 'comint) ;;; Customization: (defvar geiser-log--buffer-name "*geiser messages*" "Name of the Geiser log buffer.") (defvar geiser-log--max-buffer-size 32000 "Maximum size of the Geiser messages log.") (defvar geiser-log--max-message-size 2048 "Maximum size of individual Geiser log messages.") (defvar geiser-log-verbose-p nil "Log purely informational messages. Useful for debugging.") (defvar geiser-log--inhibit-p nil "Set this to t to inhibit all log messages") ;;; Log buffer and mode: (define-derived-mode geiser-messages-mode fundamental-mode "Geiser Messages" "Simple mode for Geiser log messages buffer." (buffer-disable-undo) (add-hook 'after-change-functions '(lambda (b e len) (let ((inhibit-read-only t)) (when (> b geiser-log--max-buffer-size) (delete-region (point-min) b)))) nil t) (setq buffer-read-only t)) (geiser-popup--define log geiser-log--buffer-name geiser-messages-mode) ;;; Logging functions: (defun geiser-log--msg (type &rest args) (unless geiser-log--inhibit-p (geiser-log--with-buffer (goto-char (point-max)) (insert (geiser--shorten-str (format "\n%s: %s\n" type (apply 'format args)) geiser-log--max-message-size))))) (defsubst geiser-log--warn (&rest args) (apply 'geiser-log--msg 'WARNING args)) (defsubst geiser-log--error (&rest args) (apply 'geiser-log--msg 'ERROR args)) (defsubst geiser-log--info (&rest args) (when geiser-log-verbose-p (apply 'geiser-log--msg 'INFO args) "")) ;;; User commands: (defun geiser-show-logs (&optional arg) "Show Geiser log messages. With prefix, activates all logging levels." (interactive "P") (when arg (setq geiser-log-verbose-p t)) (geiser-log--pop-to-buffer)) (defun geiser-log-clear () "Clean all logs." (interactive) (geiser-log--with-buffer (delete-region (point-min) (point-max)))) (defun geiser-log-toggle-verbose () "Toggle verbose logs" (interactive) (setq geiser-log-verbose-p (not geiser-log-verbose-p)) (message "Geiser verbose logs %s" (if geiser-log-verbose-p "enabled" "disabled"))) (defun geiser-log--deactivate () (interactive) (setq geiser-log-verbose-p nil) (when (eq (current-buffer) (geiser-log--buffer)) (View-quit))) (define-key geiser-messages-mode-map "c" 'geiser-log-clear) (define-key geiser-messages-mode-map "Q" 'geiser-log--deactivate) (provide 'geiser-log) geiser-0.8.1/elisp/geiser-custom.el0000644000175000017500000000373012600550203014137 00000000000000;;; geiser-custom.el -- customization utilities ;; Copyright (C) 2009, 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 14, 2009 21:49 (require 'font-lock) (require 'geiser-base) ;;; Customization group: (defgroup geiser nil "Geiser framework for Scheme-Emacs interaction." :group 'languages) ;;; Faces: (defgroup geiser-faces nil "Faces used by Geiser." :group 'geiser :group 'faces) (defmacro geiser-custom--defface (face def group doc) (declare (doc-string 4)) (let ((face (intern (format "geiser-font-lock-%s" face)))) `(defface ,face (face-default-spec ,def) ,(format "Face for %s." doc) :group ',group :group 'geiser-faces))) (put 'geiser-custom--defface 'lisp-indent-function 1) ;;; Reload support: (defvar geiser-custom--memoized-vars nil) (defun geiser-custom--memoize (name) (add-to-list 'geiser-custom--memoized-vars name)) (defmacro geiser-custom--defcustom (name &rest body) (declare (doc-string 3) (debug (name body))) `(progn (geiser-custom--memoize ',name) (defcustom ,name ,@body))) (defun geiser-custom--memoized-state () (let ((result)) (dolist (name geiser-custom--memoized-vars result) (when (boundp name) (push (cons name (symbol-value name)) result))))) (put 'geiser-custom--defcustom 'lisp-indent-function 2) (defconst geiser-custom-font-lock-keywords (eval-when-compile `((,(concat "(\\(geiser-custom--\\(?:defcustom\\|defface\\)\\)\\_>" "[ \t'\(]*" "\\(\\(?:\\sw\\|\\s_\\)+\\)?") (1 font-lock-keyword-face) (2 font-lock-variable-name-face nil t))))) (font-lock-add-keywords 'emacs-lisp-mode geiser-custom-font-lock-keywords) (provide 'geiser-custom) geiser-0.8.1/elisp/geiser-version.el0000644000175000017500000000110312607252023014310 00000000000000;;; geiser-version.el.in -- geiser's version ;; Copyright (C) 2009 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . (defvar geiser-version-string "Geiser 0.8.1" "Geiser's version as a string.") (defun geiser-version () "Echoes Geiser's version." (interactive) (message "%s" geiser-version-string)) (provide 'geiser-version) geiser-0.8.1/elisp/geiser-racket.el0000644000175000017500000003307212606700545014114 00000000000000;; geiser-racket.el -- geiser support for Racket scheme ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Apr 25, 2009 21:13 (require 'geiser-edit) (require 'geiser-doc) (require 'geiser-eval) (require 'geiser-image) (require 'geiser-syntax) (require 'geiser-custom) (require 'geiser-base) (require 'geiser) (require 'compile) (eval-when-compile (require 'cl)) ;;; Customization: (defgroup geiser-racket nil "Customization for Geiser's Racket flavour." :group 'geiser) (geiser-custom--defcustom geiser-racket-binary (cond ((eq system-type 'windows-nt) "Racket.exe") (t "racket")) "Name to use to call the racket executable when starting a REPL." :type '(choice string (repeat string)) :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-gracket-binary (cond ((eq system-type 'windows-nt) "GRacket-text.exe") (t "gracket-text")) "Name to use to call the gracket executable when starting a REPL. This executable is used by `run-gracket', and, if `geiser-racket-use-gracket-p' is set to t, by `run-racket'." :type '(choice string (repeat string)) :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-collects nil "A list of paths to be added to racket's collection directories." :type '(repeat file) :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-init-file "~/.racket-geiser" "Initialization file with user code for the racket REPL." :type 'string :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-use-gracket-p nil "Whether to use the gracket binary to start Racket REPLs." :type 'boolean :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-extra-keywords '("provide" "require" "unless" "when" "with-handlers") "Extra keywords highlighted in Racket buffers." :type '(repeat string) :group 'geiser-racket) (geiser-custom--defcustom geiser-racket-case-sensitive-p t "Non-nil means keyword highlighting is case-sensitive." :type 'boolean :group 'geiser-racket) ;;; REPL support: (defsubst geiser-racket--real-binary () (if geiser-racket-use-gracket-p geiser-racket-gracket-binary geiser-racket-binary)) (defun geiser-racket--binary () (let ((binary (geiser-racket--real-binary))) (if (listp binary) (car binary) binary))) (defun geiser-racket--parameters () "Return a list with all parameters needed to start racket. This function uses `geiser-racket-init-file' if it exists." (let ((init-file (and (stringp geiser-racket-init-file) (expand-file-name geiser-racket-init-file))) (binary (geiser-racket--real-binary)) (rackdir (expand-file-name "racket/" geiser-scheme-dir))) `("-i" "-q" "-S" ,rackdir ,@(apply 'append (mapcar (lambda (p) (list "-S" p)) geiser-racket-collects)) ,@(and (listp binary) (cdr binary)) ,@(and init-file (file-readable-p init-file) (list "-f" init-file)) "-f" ,(expand-file-name "geiser/startup.rkt" rackdir)))) (defconst geiser-racket--prompt-regexp "\\(mzscheme\\|racket\\)@[^ ]*> ") ;;; Remote REPLs (defun connect-to-racket () "Start a Racket REPL connected to a remote process. The remote process needs to be running a REPL server started using start-geiser, a procedure in the geiser/server module." (interactive) (geiser-connect 'racket)) ;;; Evaluation support: (defconst geiser-racket--module-re "^(module[+*]? +\\([^ ]+\\)\\W+\\([^ ]+\\)?") (defun geiser-racket--explicit-module () (save-excursion (geiser-syntax--pop-to-top) (and (looking-at geiser-racket--module-re) (let ((mod (match-string-no-properties 1)) (lang (match-string-no-properties 2))) (cons (geiser-syntax--form-from-string mod) (geiser-syntax--form-from-string lang)))))) (defun geiser-racket--language () (or (cdr (geiser-racket--explicit-module)) (save-excursion (goto-char (point-min)) (if (re-search-forward "^#lang +\\([^ ]+\\)" nil t) (geiser-syntax--form-from-string (match-string-no-properties 1)))) "#f")) (defun geiser-racket--implicit-module (&optional pos) (save-excursion (goto-char (point-min)) (when (re-search-forward "^#lang " nil t) (if pos (progn (end-of-line) (list (point))) (buffer-file-name))))) (defun geiser-racket--eval-bounds () (geiser-racket--implicit-module t)) (defun geiser-racket--find-module () (let ((bf (geiser-racket--implicit-module)) (sub (car (geiser-racket--explicit-module)))) (cond ((and (not bf) (not sub)) nil) ((and (not bf) sub) sub) (sub `(submod (file ,bf) ,sub)) (t bf)))) (defun geiser-racket--enter-command (module) (when (or (stringp module) (listp module)) (cond ((zerop (length module)) ",enter #f") ((or (listp module) (file-name-absolute-p module)) (format ",enter %S" module)) (t (format ",enter %s" module))))) (defun geiser-racket--geiser-procedure (proc &rest args) (case proc ((eval compile) (format ",geiser-eval %s %s %s" (or (car args) "#f") (geiser-racket--language) (mapconcat 'identity (cdr args) " "))) ((load-file compile-file) (format ",geiser-load %S" (geiser-racket--find-module))) ((no-values) ",geiser-no-values") (t (format ",apply geiser:%s (%s)" proc (mapconcat 'identity args " "))))) (defun geiser-racket--get-module (&optional module) (cond ((null module) (or (geiser-racket--find-module) :f)) ((symbolp module) module) ((and (stringp module) (file-name-absolute-p module)) module) ((stringp module) (make-symbol module)) (t nil))) (defun geiser-racket--symbol-begin (module) (save-excursion (skip-syntax-backward "^'-()>") (point))) (defun geiser-racket--import-command (module) (and (stringp module) (not (zerop (length module))) (format "(require %s)" module))) (defun geiser-racket--exit-command () (comint-send-eof) (get-buffer-process (current-buffer))) (defconst geiser-racket--binding-forms '("for" "for/list" "for/hash" "for/hasheq" "for/and" "for/or" "for/lists" "for/first" "for/last" "for/fold" "for:" "for/list:" "for/hash:" "for/hasheq:" "for/and:" "for/or:" "for/lists:" "for/first:" "for/last:" "for/fold:" "define-syntax-rule")) (defconst geiser-racket--binding-forms* '("for*" "for*/list" "for*/lists" "for*/hash" "for*/hasheq" "for*/and" "for*/or" "for*/first" "for*/last" "for*/fold" "for*:" "for*/list:" "for*/lists:" "for*/hash:" "for*/hasheq:" "for*/and:" "for*/or:" "for*/first:" "for*/last:" "for*/fold:")) ;;; External help (defsubst geiser-racket--get-help (symbol module) (geiser-eval--send/wait `(:scm ,(format ",help %s %s" symbol module)))) (defun geiser-racket--external-help (id module) (message "Looking up manual for '%s'..." id) (let* ((ret (geiser-racket--get-help id (format "%S" module))) (out (geiser-eval--retort-output ret)) (ret (if (and out (string-match " but provided by:\n +\\(.+\\)\n" out)) (geiser-racket--get-help id (match-string 1 out)) ret))) (unless (string-match "^Sending to web browser.+" (geiser-eval--retort-output ret)) (minibuffer-message "%s not found" (current-message))) t)) ;;; Error display (defconst geiser-racket--file-rxs '(nil "path:\"?\\([^>\"\n]+\\)\"?>" "module: \"\\([^>\"\n]+\\)\"")) (defconst geiser-racket--geiser-file-rx (format "^ *%s/?racket/geiser" (regexp-quote geiser-scheme-dir))) (defun geiser-racket--purge-trace () (save-excursion (while (re-search-forward geiser-racket--geiser-file-rx nil t) (kill-whole-line)))) (defun geiser-racket--display-error (module key msg) (when key (insert "Error: ") (geiser-doc--insert-button key nil 'racket) (newline 2)) (when msg (let ((p (point))) (insert msg) (let ((end (point))) (goto-char p) (when key (geiser-racket--purge-trace)) (mapc 'geiser-edit--buttonize-files geiser-racket--file-rxs) (goto-char end) (newline)))) (if (and msg (string-match "\\(.+\\)$" msg)) (match-string 1 msg) key)) ;;; Trying to ascertain whether a buffer is racket code: (defun geiser-racket--guess () (or (save-excursion (goto-char (point-min)) (re-search-forward "#lang " nil t)) (geiser-racket--explicit-module))) ;;; Keywords and syntax (defvar geiser-racket-font-lock-forms '(("^#lang\\>" . 0) ("\\[\\(else\\)\\>" . 1) ("(\\(define/match\\)\\W+[[(]?\\(\\w+\\)+\\b" (1 font-lock-keyword-face) (2 font-lock-function-name-face)))) (defun geiser-racket--keywords () (append geiser-racket-font-lock-forms (geiser-syntax--simple-keywords geiser-racket-extra-keywords))) (geiser-syntax--scheme-indent (begin0 1) (case-lambda: 0) (class* defun) (compound-unit/sig 0) (define: defun) (for 1) (for* 1) (for*/and 1) (for*/first 1) (for*/fold 2) (for*/hash 1) (for*/hasheq 1) (for*/hasheqv 1) (for*/last 1) (for*/list 1) (for*/lists 2) (for*/or 1) (for*/product 1) (for*/set 1) (for*/seteq 1) (for*/seteqv 1) (for*/sum 1) (for*/vector 1) (for/and 1) (for/first 1) (for/fold 2) (for/hash 1) (for/hasheq 1) (for/hasheqv 1) (for/last 1) (for/list 1) (for/lists 2) (for/or 1) (for/product 1) (for/set 1) (for/seteq 1) (for/seteqv 1) (for/sum 1) (for/vector 1) (instantiate 2) (interface 1) (lambda/kw 1) (lambda: 1) (let*-values: 1) (let+ 1) (let-values: 1) (let/cc: 1) (let: 1) (letrec-values: 1) (letrec: 1) (local 1) (match-let 1) (match-let-values 1) (match/values 1) (mixin 2) (module defun) (module+ defun) (module* defun) (parameterize-break 1) (quasisyntax/loc 1) (send* 1) (splicing-let 1) (splicing-let-syntax 1) (splicing-let-syntaxes 1) (splicing-let-values 1) (splicing-letrec 1) (splicing-letrec-syntax 1) (splicing-letrec-syntaxes 1) (splicing-letrec-syntaxes+values 1) (splicing-letrec-values 1) (splicing-local 1) (struct 1) (syntax-id-rules defun) (syntax/loc 1) (type-case defun) (unit defun) (unit/sig 2) (with-handlers 1) (with-handlers: 1)) ;;; REPL Startup (defvar geiser-racket-minimum-version "5.3") (defun geiser-racket--version (binary) (shell-command-to-string (format "%s -e '(display (version))'" binary))) (defvar geiser-racket--image-cache-dir nil) (defun geiser-racket--startup (remote) (set (make-local-variable 'compilation-error-regexp-alist) `(("^ *\\([^:(\t\n]+\\):\\([0-9]+\\):\\([0-9]+\\):" 1 2 3))) (compilation-setup t) (if geiser-image-cache-dir (geiser-eval--send/wait `(:eval (image-cache ,geiser-image-cache-dir) geiser/user)) (setq geiser-racket--image-cache-dir (geiser-eval--send/result '(:eval (image-cache) geiser/user))))) (defun geiser-racket--image-cache-dir () (or geiser-image-cache-dir geiser-racket--image-cache-dir)) ;;; Additional commands (defvar geiser-racket--submodule-history ()) (defun geiser-racket--submodule-form (name) (format "module[+*]? %s" (cond ((eq 1 name) "") ((numberp name) (read-string "Submodule name: " nil 'geiser-racket--submodule-history)) ((stringp name) name) (t "")))) (defun geiser-racket-toggle-submodules (&optional name) "Toggle visibility of submodule forms. Use a prefix to be asked for a submodule name." (interactive "p") (geiser-edit--toggle-visibility (geiser-racket--submodule-form name))) (defun geiser-racket-show-submodules (&optional name) "Unconditionally shows all submodule forms. Use a prefix to be asked for a submodule name." (interactive "p") (cond ((eq 1 name) (geiser-edit--show-all)) (t (geiser-edit--show (geiser-racket--submodule-form name))))) (defun geiser-racket-hide-submodules (&optional name) "Unconditionally hides all visible submodules. Use a prefix to be asked for a submodule name." (interactive "p") (geiser-edit--hide (geiser-racket--submodule-form name))) ;;; Implementation definition: (define-geiser-implementation racket (unsupported-procedures '(callers callees generic-methods)) (binary geiser-racket--binary) (minimum-version geiser-racket-minimum-version) (version-command geiser-racket--version) (arglist geiser-racket--parameters) (repl-startup geiser-racket--startup) (prompt-regexp geiser-racket--prompt-regexp) (marshall-procedure geiser-racket--geiser-procedure) (find-module geiser-racket--get-module) (enter-command geiser-racket--enter-command) (import-command geiser-racket--import-command) (exit-command geiser-racket--exit-command) (find-symbol-begin geiser-racket--symbol-begin) (eval-bounds geiser-racket--eval-bounds) (display-error geiser-racket--display-error) (external-help geiser-racket--external-help) (check-buffer geiser-racket--guess) (keywords geiser-racket--keywords) (image-cache-dir geiser-racket--image-cache-dir) (case-sensitive geiser-racket-case-sensitive-p) (binding-forms geiser-racket--binding-forms) (binding-forms* geiser-racket--binding-forms*)) (geiser-impl--add-to-alist 'regexp "\\.ss$" 'racket t) (geiser-impl--add-to-alist 'regexp "\\.rkt$" 'racket t) (defun run-gracket () "Start the Racket REPL using gracket instead of plain racket." (interactive) (let ((geiser-racket-use-gracket-p t)) (run-racket))) (provide 'geiser-racket) geiser-0.8.1/elisp/Makefile.in0000644000175000017500000004543612607252021013111 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = elisp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_lisp_LISP) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = geiser-version.el geiser-load.el CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(lispdir)" "$(DESTDIR)$(lispdir)" dist_lispLISP_INSTALL = $(INSTALL_DATA) lispLISP_INSTALL = $(INSTALL_DATA) LISP = $(dist_lisp_LISP) $(lisp_LISP) $(noinst_LISP) am__ELFILES = geiser-autodoc.el geiser-base.el geiser-chicken.el \ geiser-company.el geiser-compile.el geiser-completion.el \ geiser-connection.el geiser-custom.el geiser-debug.el \ geiser-doc.el geiser-edit.el geiser-eval.el geiser-guile.el \ geiser-image.el geiser-impl.el geiser-install.el \ geiser-load.el geiser-log.el geiser-menu.el geiser-mode.el \ geiser-popup.el geiser-racket.el geiser-reload.el \ geiser-repl.el geiser-syntax.el geiser-version.el \ geiser-xref.el geiser.el am__ELCFILES = $(am__ELFILES:.el=.elc) ELCFILES = $(LISP:.el=.elc) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/geiser-load.el.in \ $(srcdir)/geiser-version.el.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = geiser-install.el.in geiser-load.el.in dist_lisp_LISP = \ geiser-autodoc.el \ geiser-base.el \ geiser-company.el \ geiser-compile.el \ geiser-completion.el \ geiser-connection.el \ geiser-custom.el \ geiser-debug.el \ geiser-doc.el \ geiser-edit.el \ geiser.el \ geiser-eval.el \ geiser-guile.el \ geiser-image.el \ geiser-impl.el \ geiser-log.el \ geiser-menu.el \ geiser-mode.el \ geiser-racket.el \ geiser-chicken.el \ geiser-popup.el \ geiser-reload.el \ geiser-repl.el \ geiser-syntax.el \ geiser-xref.el \ geiser-version.el lisp_LISP = geiser-install.el noinst_LISP = geiser-load.el CLEANFILES = geiser-install.el geiser-load.el all: all-am .SUFFIXES: .SUFFIXES: .el .elc $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu elisp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu elisp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): geiser-version.el: $(top_builddir)/config.status $(srcdir)/geiser-version.el.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ geiser-load.el: $(top_builddir)/config.status $(srcdir)/geiser-load.el.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ .el.elc: if test "$(EMACS)" != "no"; then \ am__dir=. am__subdir_includes=''; \ case $@ in */*) \ am__dir=`echo '$@' | sed 's,/[^/]*$$,,'`; \ am__subdir_includes="-L $$am__dir -L $(srcdir)/$$am__dir"; \ esac; \ test -d "$$am__dir" || $(MKDIR_P) "$$am__dir" || exit 1; \ $(EMACS) --batch \ $(AM_ELCFLAGS) $(ELCFLAGS) \ $$am__subdir_includes -L $(builddir) -L $(srcdir) \ --eval "(defun byte-compile-dest-file (f) \"$@\")" \ --eval "(unless (byte-compile-file \"$<\") (kill-emacs 1))"; \ else :; fi install-dist_lispLISP: $(dist_lisp_LISP) $(ELCFILES) @$(NORMAL_INSTALL) @if test "$(EMACS)" != no && test -n "$(lispdir)"; then \ list='$(dist_lisp_LISP)'; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(lispdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(lispdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ echo " $(dist_lispLISP_INSTALL) '$$d$$p' '$(DESTDIR)$(lispdir)/$$f'"; \ $(dist_lispLISP_INSTALL) "$$d$$p" "$(DESTDIR)$(lispdir)/$$f" || exit $$?; \ if test -f $${p}c; then \ echo " $(dist_lispLISP_INSTALL) '$${p}c' '$(DESTDIR)$(lispdir)/$${f}c'"; \ $(dist_lispLISP_INSTALL) "$${p}c" "$(DESTDIR)$(lispdir)/$${f}c" || exit $$?; \ else : ; fi; \ done; \ else : ; fi uninstall-dist_lispLISP: @$(NORMAL_UNINSTALL) @test "$(EMACS)" != no && test -n "$(lispdir)" || exit 0; \ list='$(dist_lisp_LISP)'; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ files="$$files "`echo "$$files" | sed 's|$$|c|'`; \ dir='$(DESTDIR)$(lispdir)'; $(am__uninstall_files_from_dir) clean-lisp: -rm -f $(ELCFILES) install-lispLISP: $(lisp_LISP) $(ELCFILES) @$(NORMAL_INSTALL) @if test "$(EMACS)" != no && test -n "$(lispdir)"; then \ list='$(lisp_LISP)'; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(lispdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(lispdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ echo " $(lispLISP_INSTALL) '$$d$$p' '$(DESTDIR)$(lispdir)/$$f'"; \ $(lispLISP_INSTALL) "$$d$$p" "$(DESTDIR)$(lispdir)/$$f" || exit $$?; \ if test -f $${p}c; then \ echo " $(lispLISP_INSTALL) '$${p}c' '$(DESTDIR)$(lispdir)/$${f}c'"; \ $(lispLISP_INSTALL) "$${p}c" "$(DESTDIR)$(lispdir)/$${f}c" || exit $$?; \ else : ; fi; \ done; \ else : ; fi uninstall-lispLISP: @$(NORMAL_UNINSTALL) @test "$(EMACS)" != no && test -n "$(lispdir)" || exit 0; \ list='$(lisp_LISP)'; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ files="$$files "`echo "$$files" | sed 's|$$|c|'`; \ dir='$(DESTDIR)$(lispdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LISP) $(ELCFILES) installdirs: for dir in "$(DESTDIR)$(lispdir)" "$(DESTDIR)$(lispdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-lisp mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_lispLISP install-lispLISP install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_lispLISP uninstall-lispLISP .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-lisp cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_lispLISP install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-lispLISP \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-dist_lispLISP \ uninstall-lispLISP .PRECIOUS: Makefile geiser-install.el: $(srcdir)/geiser.el $(srcdir)/geiser-install.el.in @sed -e "s|@SCHEME_DIR[@]|$(datarootdir)/geiser|" \ $(srcdir)/geiser-install.el.in >$@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geiser-0.8.1/elisp/geiser-doc.el0000644000175000017500000004207212606701241013402 00000000000000;;; geiser-doc.el -- accessing scheme-provided documentation ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Feb 14, 2009 14:09 (require 'geiser-edit) (require 'geiser-impl) (require 'geiser-completion) (require 'geiser-autodoc) (require 'geiser-eval) (require 'geiser-syntax) (require 'geiser-menu) (require 'geiser-popup) (require 'geiser-custom) (require 'geiser-base) (require 'button) ;;; Customization: (defgroup geiser-doc nil "Options for documentation buffers." :group 'geiser) (geiser-custom--defface doc-title 'bold geiser-doc "article titles in documentation buffers") (geiser-custom--defface doc-link 'link geiser-doc "links in documentation buffers") (geiser-custom--defface doc-button 'button geiser-doc "buttons in documentation buffers") ;;; Implementation (geiser-impl--define-caller geiser-doc--external-help external-help (symbol module) "By default, Geiser will display help about an identifier in a help buffer, after collecting the associated signature and docstring. You can provide an alternative function for displaying help (e.g. browse an HTML page) implementing this method.") ;;; Documentation browser history: (defvar geiser-doc-history-size 50) (defvar geiser-doc--history nil) (defun geiser-doc--make-history () (list nil ; current (make-ring geiser-doc-history-size) ; previous (make-ring geiser-doc-history-size))) ; next (setq geiser-doc--history (geiser-doc--make-history)) (eval-after-load "session" '(add-to-list 'session-globals-exclude 'geiser-doc--history)) (defsubst geiser-doc--history-current () (car geiser-doc--history)) (defsubst geiser-doc--history-previous-link () (ring-ref (cadr geiser-doc--history) 0)) (defsubst geiser-doc--history-next-link () (ring-ref (caddr geiser-doc--history) 0)) (defun geiser-doc--history-push (link) (unless (or (null link) (equal link (geiser-doc--history-current))) (when (not (null (geiser-doc--history-current))) (let ((next (geiser-doc--history-next))) (unless (equal link next) (when next (geiser-doc--history-previous)) (ring-insert (nth 1 geiser-doc--history) (car geiser-doc--history))))) (setcar geiser-doc--history link)) link) (defsubst geiser-doc--history-next-p () (not (ring-empty-p (nth 2 geiser-doc--history)))) (defun geiser-doc--history-next (&optional forget-current) (when (geiser-doc--history-next-p) (when (and (car geiser-doc--history) (not forget-current)) (ring-insert (nth 1 geiser-doc--history) (car geiser-doc--history))) (setcar geiser-doc--history (ring-remove (nth 2 geiser-doc--history) 0)))) (defsubst geiser-doc--history-previous-p () (not (ring-empty-p (nth 1 geiser-doc--history)))) (defun geiser-doc--history-previous (&optional forget-current) (when (geiser-doc--history-previous-p) (when (and (car geiser-doc--history) (not forget-current)) (ring-insert (nth 2 geiser-doc--history) (car geiser-doc--history))) (setcar geiser-doc--history (ring-remove (nth 1 geiser-doc--history) 0)))) ;;; Links (defsubst geiser-doc--make-link (target module impl) (list target module impl)) (defsubst geiser-doc--link-target (link) (nth 0 link)) (defsubst geiser-doc--link-module (link) (nth 1 link)) (defsubst geiser-doc--link-impl (link) (nth 2 link)) (defun geiser-doc--follow-link (link) (let ((target (geiser-doc--link-target link)) (module (geiser-doc--link-module link)) (impl (geiser-doc--link-impl link))) (when (and (or target module) impl) (with--geiser-implementation impl (if (null target) (geiser-doc-module module impl) (let ((geiser-eval--get-module-function (lambda (x) module))) (geiser-doc-symbol target module impl))))))) (make-variable-buffer-local (defvar geiser-doc--buffer-link nil)) (defsubst geiser-doc--implementation () (geiser-doc--link-impl geiser-doc--buffer-link)) (defun geiser-doc--button-action (button) (let ((link (button-get button 'geiser-link))) (when link (geiser-doc--follow-link link)))) (define-button-type 'geiser-doc--button 'action 'geiser-doc--button-action 'follow-link t) (defun geiser-doc--make-module-button (beg end module impl) (let ((link (geiser-doc--make-link nil module impl)) (help (format "Help for module %s" module))) (make-text-button beg end :type 'geiser-doc--button 'face 'geiser-font-lock-doc-link 'geiser-link link 'help-echo help))) (defun geiser-doc--insert-button (target module impl &optional sign) (let ((link (geiser-doc--make-link target module impl)) (text (format "%s" (or (and sign (geiser-autodoc--str* sign)) target module))) (help (format "%smodule %s" (if target (format "%s in " target) "") (or module "")))) (insert-text-button text :type 'geiser-doc--button 'face 'geiser-font-lock-doc-link 'geiser-link link 'help-echo help))) (defun geiser-doc--xbutton-action (button) (when geiser-doc--buffer-link (let ((kind (or (button-get button 'x-kind) 'source)) (target (geiser-doc--link-target geiser-doc--buffer-link)) (module (geiser-doc--link-module geiser-doc--buffer-link)) (impl (geiser-doc--link-impl geiser-doc--buffer-link))) (with--geiser-implementation impl (cond ((eq kind 'source) (if target (geiser-edit-symbol target nil (point-marker)) (geiser-edit-module module))) ((eq kind 'manual) (geiser-doc--external-help impl (or target module) module))))))) (define-button-type 'geiser-doc--xbutton 'action 'geiser-doc--xbutton-action 'face 'geiser-font-lock-doc-button 'follow-link t) (defun geiser-doc--insert-xbutton (&optional manual) (let ((label (if manual "[manual]" "[source]")) (help (if manual "Look up in Scheme manual" "Go to definition"))) (insert-text-button label :type 'geiser-doc--xbutton 'help-echo help 'x-kind (if manual 'manual 'source)))) (defun geiser-doc--insert-xbuttons (impl) (when (geiser-impl--method 'external-help impl) (geiser-doc--insert-xbutton t) (insert " ")) (geiser-doc--insert-xbutton)) (defun geiser-doc--insert-nav-button (next) (let* ((lnk (if next (geiser-doc--history-next-link) (geiser-doc--history-previous-link))) (what (geiser-doc--link-target lnk)) (what (or what (geiser-doc--link-module lnk))) (action (if next '(lambda (b) (geiser-doc-next)) '(lambda (b) (geiser-doc-previous))))) (insert-text-button (if next "[forward]" "[back]") 'action action 'help-echo (format "Previous help item (%s)" what) 'face 'geiser-font-lock-doc-button 'follow-link t))) ;;; Auxiliary functions: (defun geiser-doc--manual-available-p () (geiser-impl--method 'external-help geiser-impl--implementation)) (defun geiser-doc--module (&optional mod impl) (let ((impl (or impl (geiser-doc--link-impl geiser-doc--buffer-link))) (mod (or mod (geiser-doc--link-module geiser-doc--buffer-link)))) (geiser-impl--call-method 'find-module impl mod))) (defun geiser-doc--insert-title (title) (let ((p (point))) (insert (format "%s" title)) (fill-paragraph nil) (let ((indent-line-function 'lisp-indent-line)) (indent-region p (point))) (put-text-property p (point) 'face 'geiser-font-lock-doc-title) (newline))) (defun geiser-doc--insert-list (title lst module impl) (when lst (geiser-doc--insert-title title) (newline) (dolist (w lst) (let ((name (car w)) (signature (cdr (assoc "signature" w))) (info (cdr (assoc "info" w)))) (insert "\t- ") (if module (geiser-doc--insert-button name module impl signature) (geiser-doc--insert-button nil name impl)) (when info (insert (format " %s" info))) (newline))) (newline))) (defun geiser-doc--insert-footer (impl) (newline 2) (geiser-doc--insert-xbuttons impl) (let* ((prev (and (geiser-doc--history-previous-p) 8)) (nxt (and (geiser-doc--history-next-p) 10)) (len (max 1 (- (window-width) (- (point) (line-beginning-position)) (or prev 0) (or nxt 0))))) (when (or prev nxt) (insert (make-string len ?\ ))) (when prev (geiser-doc--insert-nav-button nil) (insert " ")) (when nxt (geiser-doc--insert-nav-button t)))) ;;; Commands: (defun geiser-doc--get-docstring (symbol module) (geiser-eval--send/result `(:eval (:ge symbol-documentation ',symbol) ,module))) (defun geiser-doc--get-module-exports (module) (geiser-eval--send/result `(:eval (:ge module-exports '(:module ,module)) :f))) (defun geiser-doc--buttonize-modules (impl) (save-excursion (goto-char (point-min)) (while (re-search-forward "in module \\([^.\n]+\\)[.\n ]" nil t) (geiser-doc--make-module-button (match-beginning 1) (match-end 1) (geiser-doc--module (match-string 1) impl) impl)))) (defun geiser-doc--render-docstring (docstring symbol &optional module impl) (erase-buffer) (geiser-doc--insert-title (geiser-autodoc--str* (cdr (assoc "signature" docstring)))) (newline) (insert (or (cdr (assoc "docstring" docstring)) "")) (geiser-doc--buttonize-modules impl) (setq geiser-doc--buffer-link (geiser-doc--history-push (geiser-doc--make-link symbol module impl))) (geiser-doc--insert-footer impl) (goto-char (point-min))) (defun geiser-doc-symbol (symbol &optional module impl) (let* ((impl (or impl geiser-impl--implementation)) (module (geiser-doc--module (or module (geiser-eval--get-module)) impl))) (let ((ds (geiser-doc--get-docstring symbol module))) (if (or (not ds) (not (listp ds))) (message "No documentation available for '%s'" symbol) (geiser-doc--with-buffer (geiser-doc--render-docstring ds symbol module impl)) (geiser-doc--pop-to-buffer))))) (defun geiser-doc-symbol-at-point (&optional arg) "Get docstring for symbol at point. With prefix argument, ask for symbol (with completion)." (interactive "P") (let ((symbol (or (and (not arg) (geiser--symbol-at-point)) (geiser-completion--read-symbol "Symbol: " (geiser--symbol-at-point))))) (when symbol (geiser-doc-symbol symbol)))) (defun geiser-doc-look-up-manual (&optional arg) "Look up manual for symbol at point. With prefix argument, ask for the lookup symbol (with completion)." (interactive "P") (unless (geiser-doc--manual-available-p) (error "No manual available")) (let ((symbol (or (and (not arg) (geiser--symbol-at-point)) (geiser-completion--read-symbol "Symbol: ")))) (geiser-doc--external-help geiser-impl--implementation symbol (geiser-eval--get-module)))) (defconst geiser-doc--sections '(("Procedures:" "procs") ("Syntax:" "syntax") ("Variables:" "vars") ("Submodules:" "modules" t))) (defconst geiser-doc--sections-re (format "^%s\n" (regexp-opt (mapcar 'car geiser-doc--sections)))) (defun geiser-doc-module (&optional module impl) "Display information about a given module." (interactive) (let* ((impl (or impl geiser-impl--implementation)) (module (geiser-doc--module (or module (geiser-completion--read-module)) impl)) (msg (format "Retrieving documentation for %s ..." module)) (exports (progn (message "%s" msg) (geiser-doc--get-module-exports module)))) (if (not exports) (message "No information available for %s" module) (geiser-doc--with-buffer (erase-buffer) (geiser-doc--insert-title (format "%s" module)) (newline) (dolist (g geiser-doc--sections) (geiser-doc--insert-list (car g) (cdr (assoc (cadr g) exports)) (and (not (cddr g)) module) impl)) (setq geiser-doc--buffer-link (geiser-doc--history-push (geiser-doc--make-link nil module impl))) (geiser-doc--insert-footer impl) (goto-char (point-min))) (message "%s done" msg) (geiser-doc--pop-to-buffer)))) (defun geiser-doc-next-section () "Move to next section in this page." (interactive) (forward-line) (re-search-forward geiser-doc--sections-re nil t) (forward-line -1)) (defun geiser-doc-previous-section () "Move to previous section in this page." (interactive) (re-search-backward geiser-doc--sections-re nil t)) (defun geiser-doc-next (&optional forget-current) "Go to next page in documentation browser. With prefix, the current page is deleted from history." (interactive "P") (let ((link (geiser-doc--history-next forget-current))) (unless link (error "No next page")) (geiser-doc--follow-link link))) (defun geiser-doc-previous (&optional forget-current) "Go to previous page in documentation browser. With prefix, the current page is deleted from history." (interactive "P") (let ((link (geiser-doc--history-previous forget-current))) (unless link (error "No previous page")) (geiser-doc--follow-link link))) (defun geiser-doc-kill-page () "Kill current page if a previous or next one exists." (interactive) (condition-case nil (geiser-doc-previous t) (error (geiser-doc-next t)))) (defun geiser-doc-refresh () "Refresh the contents of current page." (interactive) (when geiser-doc--buffer-link (geiser-doc--follow-link geiser-doc--buffer-link))) (defun geiser-doc-clean-history () "Clean up the document browser history." (interactive) (when (y-or-n-p "Clean browsing history? ") (setq geiser-doc--history (geiser-doc--make-history)) (geiser-doc-refresh)) (message "")) ;;; Documentation browser and mode: (defun geiser-doc-edit-symbol-at-point () "Open definition of symbol at point." (interactive) (let* ((impl (geiser-doc--implementation)) (module (geiser-doc--module))) (unless (and impl module) (error "I don't know what module this buffer refers to.")) (with--geiser-implementation impl (geiser-edit-symbol-at-point)))) (defvar geiser-doc-mode-map nil) (setq geiser-doc-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (set-keymap-parent map button-buffer-map) map)) (defun geiser-doc-switch-to-repl () (interactive) (switch-to-geiser nil nil (current-buffer))) (geiser-menu--defmenu doc geiser-doc-mode-map ("Next link" ("n") forward-button) ("Previous link" ("p") backward-button) ("Next section" ("N") geiser-doc-next-section) ("Previous section" ("P") geiser-doc-previous-section) -- ("Next page" ("f") geiser-doc-next "Next item" :enable (geiser-doc--history-next-p)) ("Previous page" ("b") geiser-doc-previous "Previous item" :enable (geiser-doc--history-previous-p)) -- ("Go to REPL" ("z" "\C-cz" "\C-c\C-z") geiser-doc-switch-to-repl) ("Refresh" ("g" "r") geiser-doc-refresh "Refresh current page") -- ("Edit symbol" ("." "\M-.") geiser-doc-edit-symbol-at-point :enable (geiser--symbol-at-point)) -- ("Kill item" "k" geiser-doc-kill-page "Kill this page") ("Clear history" "c" geiser-doc-clean-history) -- (custom "Browser options" geiser-doc) -- ("Quit" nil View-quit)) (defun geiser-doc-mode () "Major mode for browsing scheme documentation. \\{geiser-doc-mode-map}" (interactive) (kill-all-local-variables) (buffer-disable-undo) (setq truncate-lines t) (use-local-map geiser-doc-mode-map) (set-syntax-table scheme-mode-syntax-table) (setq mode-name "Geiser Doc") (setq major-mode 'geiser-doc-mode) (setq geiser-eval--get-module-function 'geiser-doc--module) (setq buffer-read-only t)) (geiser-popup--define doc "*Geiser documentation*" geiser-doc-mode) (provide 'geiser-doc) geiser-0.8.1/elisp/geiser-impl.el0000644000175000017500000003230612574144162013604 00000000000000;; geiser-impl.el -- generic support for scheme implementations ;; Copyright (C) 2009, 2010, 2012, 2013, 2015 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Mar 07, 2009 23:32 (require 'geiser-custom) (require 'geiser-base) (require 'help-fns) ;;; Customization: (defgroup geiser-implementation nil "Generic support for multiple Scheme implementations." :group 'geiser) (geiser-custom--defcustom geiser-default-implementation nil "Symbol naming the default Scheme implementation." :type 'symbol :group 'geiser-implementation) (geiser-custom--defcustom geiser-active-implementations '(guile racket chicken) "List of active installed Scheme implementations." :type '(repeat symbol) :group 'geiser-implementation) (geiser-custom--defcustom geiser-implementations-alist nil "A map from regular expressions or directories to implementations. When opening a new file, its full path will be matched against each one of the regular expressions or directories in this map in order to determine its scheme flavour." :type '(repeat (list (choice (group :tag "Regular expression" (const regexp) regexp) (group :tag "Directory" (const dir) directory)) symbol)) :group 'geiser-implementation) ;;; Implementation registry: (defvar geiser-impl--registry nil) (defvar geiser-impl--load-files nil) (defvar geiser-impl--method-docs nil) (defvar geiser-impl--local-methods nil) (defvar geiser-impl--local-variables nil) (geiser-custom--memoize 'geiser-impl--load-files) (make-variable-buffer-local (defvar geiser-impl--implementation nil)) (defsubst geiser-impl--impl-str (&optional impl) (let ((impl (or impl geiser-impl--implementation))) (and impl (capitalize (format "%s" impl))))) (defsubst geiser-impl--feature (impl) (intern (format "geiser-%s" impl))) (defsubst geiser-impl--load-impl (impl) (require (geiser-impl--feature impl) (cdr (assq impl geiser-impl--load-files)) t)) (defsubst geiser-impl--methods (impl) (cdr (assq impl geiser-impl--registry))) (defun geiser-impl--method (method &optional impl) (let ((impl (or impl geiser-impl--implementation geiser-default-implementation))) (cadr (assq method (geiser-impl--methods impl))))) (defun geiser-impl--call-method (method impl &rest args) (let ((fun (geiser-impl--method method impl))) (when (functionp fun) (apply fun args)))) (defun geiser-impl--method-doc (method doc user) (let* ((user (if user (format " Used via `%s'." user) "")) (extra-doc (format "%s%s" doc user))) (add-to-list 'geiser-impl--method-docs (cons method extra-doc)) (setq geiser-impl--method-docs (sort geiser-impl--method-docs (lambda (a b) (string< (symbol-name (car a)) (symbol-name (car b)))))) (put method 'function-documentation doc))) (defun geiser-implementation-help () "Shows a buffer with help on defining new supported Schemes." (interactive) (help-setup-xref (list #'geiser-implementation-help) t) (save-excursion (with-help-window (help-buffer) (princ "Geiser: supporting new Scheme implementations.\n\n") (princ "Use `define-geiser-implementation' to define ") (princ "new implementations") (princ "\n\n (define-geiser-implementation NAME &rest METHODS)\n\n") (princ (documentation 'define-geiser-implementation)) (princ "\n\nMethods used to define an implementation:\n\n") (dolist (m geiser-impl--method-docs) (let ((p (with-current-buffer (help-buffer) (point)))) (princ (format "%s: " (car m))) (princ (cdr m)) (with-current-buffer (help-buffer) (fill-region-as-paragraph p (point))) (princ "\n\n"))) (with-current-buffer standard-output (buffer-string))))) (defun geiser-impl--register-local-method (var-name method fallback doc) (add-to-list 'geiser-impl--local-methods (list var-name method fallback)) (geiser-impl--method-doc method doc var-name) (put var-name 'function-documentation doc)) (defun geiser-impl--register-local-variable (var-name method fallback doc) (add-to-list 'geiser-impl--local-variables (list var-name method fallback)) (geiser-impl--method-doc method doc var-name) (put var-name 'variable-documentation doc)) (defmacro geiser-impl--define-caller (fun-name method arglist doc) (let ((impl (make-symbol "implementation-name"))) `(progn (defun ,fun-name ,(cons impl arglist) ,doc (geiser-impl--call-method ',method ,impl ,@arglist)) (geiser-impl--method-doc ',method ,doc ',fun-name)))) (put 'geiser-impl--define-caller 'lisp-indent-function 3) (defun geiser-impl--register (file impl methods) (let ((current (assq impl geiser-impl--registry))) (if current (setcdr current methods) (push (cons impl methods) geiser-impl--registry)) (push (cons impl file) geiser-impl--load-files))) (defsubst geiser-activate-implementation (impl) (add-to-list 'geiser-active-implementations impl)) (defsubst geiser-deactivate-implementation (impl) (setq geiser-active-implementations (delq impl geiser-active-implementations))) (defsubst geiser-impl--active-p (impl) (memq impl geiser-active-implementations)) ;;; Defining implementations: (defun geiser-impl--normalize-method (m) (when (and (listp m) (= 2 (length m)) (symbolp (car m))) (if (functionp (cadr m)) m `(,(car m) (lambda (&rest) ,(cadr m)))))) (defun geiser-impl--define (file name parent methods) (let* ((methods (mapcar 'geiser-impl--normalize-method methods)) (methods (delq nil methods)) (inherited-methods (and parent (geiser-impl--methods parent))) (methods (append methods (dolist (m methods inherited-methods) (setq inherited-methods (assq-delete-all m inherited-methods)))))) (geiser-impl--register file name methods))) (defmacro define-geiser-implementation (name &rest methods) "Defines a new supported Scheme implementation. NAME can be either an unquoted symbol naming the implementation, or a two-element list (NAME PARENT), with PARENT naming another registered implementation from which to borrow methods not defined in METHODS. After NAME come the methods, each one a two element list of the form (METHOD-NAME FUN-OR-VAR), where METHOD-NAME is one of the needed methods (for a list, execute `geiser-implementation-help') and a value, variable name or function name implementing it. Omitted method names will return nil to their callers. Here's how a typical call to this macro looks like: (define-geiser-implementation guile (binary geiser-guile--binary) (arglist geiser-guile--parameters) (repl-startup geiser-guile--startup) (prompt-regexp geiser-guile--prompt-regexp) (debugger-prompt-regexp geiser-guile--debugger-prompt-regexp) (enter-debugger geiser-guile--enter-debugger) (marshall-procedure geiser-guile--geiser-procedure) (find-module geiser-guile--get-module) (enter-command geiser-guile--enter-command) (exit-command geiser-guile--exit-command) (import-command geiser-guile--import-command) (find-symbol-begin geiser-guile--symbol-begin) (display-error geiser-guile--display-error) (display-help) (check-buffer geiser-guile--guess) (keywords geiser-guile--keywords) (case-sensitive geiser-guile-case-sensitive-p)) This macro also defines a runner function (run-NAME) and a switcher (switch-to-NAME), and provides geiser-NAME." (let ((name (if (listp name) (car name) name)) (parent (and (listp name) (cadr name)))) (unless (symbolp name) (error "Malformed implementation name: %s" name)) (let ((runner (intern (format "run-%s" name))) (switcher (intern (format "switch-to-%s" name))) (runner-doc (format "Start a new %s REPL." name)) (switcher-doc (format "Switch to a running %s REPL, or start one." name)) (ask (make-symbol "ask"))) `(progn (geiser-impl--define ,load-file-name ',name ',parent ',methods) (require 'geiser-repl) (require 'geiser-menu) (defun ,runner () ,runner-doc (interactive) (run-geiser ',name)) (defun ,switcher (&optional ,ask) ,switcher-doc (interactive "P") (switch-to-geiser ,ask ',name)) (geiser-menu--add-impl ',name ',runner ',switcher))))) (defun geiser-impl--add-to-alist (kind what impl &optional append) (add-to-list 'geiser-implementations-alist (list (list kind what) impl) append)) ;;; Trying to guess the scheme implementation: (make-variable-buffer-local (defvar geiser-scheme-implementation nil "Set this buffer local variable to specify the Scheme implementation to be used by Geiser.")) (put 'geiser-scheme-implementation 'safe-local-variable 'symbolp) (defun geiser-impl--match-impl (desc bn) (let ((rx (if (eq (car desc) 'regexp) (cadr desc) (format "^%s" (regexp-quote (cadr desc)))))) (and rx (string-match-p rx bn)))) (defvar geiser-impl--impl-prompt-history nil) (defun geiser-impl--read-impl (&optional prompt impls non-req) (let* ((impls (or impls geiser-active-implementations)) (impls (mapcar 'symbol-name impls)) (prompt (or prompt "Scheme implementation: "))) (intern (completing-read prompt impls nil (not non-req) nil geiser-impl--impl-prompt-history (and (car impls) (car impls)))))) (geiser-impl--define-caller geiser-impl--check-buffer check-buffer () "Method called without arguments that should check whether the current buffer contains Scheme code of the given implementation.") (defun geiser-impl--guess (&optional prompt) (or geiser-impl--implementation (progn (hack-local-variables) (and (memq geiser-scheme-implementation geiser-active-implementations) geiser-scheme-implementation)) (and (null (cdr geiser-active-implementations)) (car geiser-active-implementations)) (catch 'impl (dolist (impl geiser-active-implementations) (when (geiser-impl--check-buffer impl) (throw 'impl impl))) (let ((bn (buffer-file-name))) (when bn (dolist (x geiser-implementations-alist) (when (and (memq (cadr x) geiser-active-implementations) (geiser-impl--match-impl (car x) bn)) (throw 'impl (cadr x))))))) geiser-default-implementation (and prompt (geiser-impl--read-impl)))) ;;; Using implementations: (defsubst geiser-impl--registered-method (impl method fallback) (let ((m (geiser-impl--method method impl))) (if (fboundp m) m (or fallback (error "%s not defined for %s implementation" method impl))))) (defsubst geiser-impl--registered-value (impl method fallback) (let ((m (geiser-impl--method method impl))) (if (functionp m) (funcall m) fallback))) (defun geiser-impl--set-buffer-implementation (&optional impl prompt) (let ((impl (or impl (geiser-impl--guess prompt)))) (when impl (unless (geiser-impl--load-impl impl) (error "Cannot find %s implementation" impl)) (setq geiser-impl--implementation impl) (dolist (m geiser-impl--local-methods) (set (make-local-variable (nth 0 m)) (geiser-impl--registered-method impl (nth 1 m) (nth 2 m)))) (dolist (m geiser-impl--local-variables) (set (make-local-variable (nth 0 m)) (geiser-impl--registered-value impl (nth 1 m) (nth 2 m))))))) (defmacro with--geiser-implementation (impl &rest body) (let* ((mbindings (mapcar (lambda (m) `(,(nth 0 m) (geiser-impl--registered-method ,impl ',(nth 1 m) ',(nth 2 m)))) geiser-impl--local-methods)) (vbindings (mapcar (lambda (m) `(,(nth 0 m) (geiser-impl--registered-value ,impl ',(nth 1 m) ',(nth 2 m)))) geiser-impl--local-variables)) (ibindings `((geiser-impl--implementation ,impl))) (bindings (append ibindings mbindings vbindings))) `(let* ,bindings ,@body))) (put 'with--geiser-implementation 'lisp-indent-function 1) ;;; Reload support: (defun geiser-impl-unload-function () (dolist (imp (mapcar (lambda (i) (geiser-impl--feature (car i))) geiser-impl--registry)) (when (featurep imp) (unload-feature imp t)))) (provide 'geiser-impl) geiser-0.8.1/README0000644000175000017500000002123512544742556010620 00000000000000* Overview Geiser is a generic Emacs/Scheme interaction mode, featuring an enhanced REPL and a set of minor modes improving Emacs' basic scheme major mode. The main functionalities provided are: - Evaluation of forms in the namespace of the current module. - Macro expansion. - File/module loading. - Namespace-aware identifier completion (including local bindings, names visible in the current module, and module names). - Autodoc: the echo area shows information about the signature of the procedure/macro around point automatically. - Jump to definition of identifier at point. - Access to documentation (including docstrings when the implementation provides it). - Listings of identifiers exported by a given module. - Listings of callers/callees of procedures. - Rudimentary support for debugging (list of evaluation/compilation error in an Emacs' compilation-mode buffer). - Support for inline images in schemes, such as Racket, that treat them as first order values. NOTE: if you're not in a hurry, Geiser's website (http://www.nongnu.org/geiser/) contains a nicer manual, also included in Geiser tarballs as a texinfo file (doc/geiser.info). * Requirements Geiser needs Emacs 23.2 or better, and at least one of the supported scheme implementations: - Guile 2.0 or better. - PLT Racket 6.0 or better. - Chicken 4.8.0 or better. * Installation The easiest way is to use ELPA/Marmalade, and just type `M-x install-package RET geiser` inside emacs. Geiser can be used either directly from its uninstalled source tree or byte-compiled and installed after perfoming the standard configure/make/make install dance. See the INSTALL file for more details. ** Chicken Addendum These steps are necessary to fully support Chicken Scheme, but are not required for any other scheme. - Install the necessary support eggs: $ chicken-install -s apropos chicken-doc - Update the Chicken documentation database: $ cd `csi -p '(chicken-home)'` $ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx * Basic configuration The loading invocations above install all supported Scheme implementations. You can list explicitly the ones that you want by setting the variable `geiser-active-implementations' *before* loading geiser.el. For instance: (setq geiser-active-implementations '(chicken guile)) On opening a scheme file, Geiser will try to guess its Scheme, defaulting to the first in the list. Use `C-c C-s' to select the implementation by hand (on a per file basis). Check the geiser customization group for some options with: M-x customize-group RET geiser RET In particular, customize `geiser--binary', which should point to an executable in your path. To start a REPL, M-x geiser. ** Completion with company-mode Geiser offers identifier and module name completion, bound to M-TAB and M-` respectively. Only names visible in the current module are offered. While that is cool and all, things are even better: if you have company-mode (http://company-mode.github.io/) installed, Geiser's completion will use it. Just require company-mode and, from then on, any new scheme buffer or REPL will use it. * Quick key reference ** In Scheme buffers: |-------------+-------------------------------------------------| | C-c C-z | Switch to REPL | | C-c C-a | Switch to REPL and current module | | C-c C-s | Specify Scheme implementation for buffer | |-------------+-------------------------------------------------| | M-. | Go to definition of identifier at point | | M-, | Go back to where M-. was last invoked | | C-c C-e m | Ask for a module and open its file | | C-c C-e C-l | Add a given directory to Scheme's load path | | C-c C-e [ | Toggle between () and [] for current form | |-------------+-------------------------------------------------| | C-M-x | Eval definition around point | | C-c M-e | Eval definition around point and switch to REPL | | C-x C-e | Eval sexp before point | | C-c C-r | Eval region | | C-c M-r | Eval region and switch to REPL | | C-c C-b | Eval buffer | | C-c M-b | Eval buffer and switch to REPL | |-------------+-------------------------------------------------| | C-c C-m x | Macro-expand definition around point | | C-c C-m e | Macro-expand sexp before point | | C-c C-m r | Marcro-expand region | |-------------+-------------------------------------------------| | C-c C-k | Compile and load current file | |-------------+-------------------------------------------------| | C-c C-d d | See documentation for identifier at point | | C-c C-d s | See short documentation for identifier at point | | C-c C-d i | Look up manual for identifier at point | | C-c C-d m | See a list of a module's exported identifiers | | C-c C-d a | Toggle autodoc mode | |-------------+-------------------------------------------------| | C-c < | Show callers of procedure at point | | C-c > | Show callees of procedure at point | |-------------+-------------------------------------------------| | M-TAB | Complete identifier at point | | M-`, C-. | Complete module name at point | | TAB | Complete identifier at point or indent | | | (If `geiser-mode-smart-tab-p' is t) | |-------------+-------------------------------------------------| ** In the REPL |-------------+----------------------------------------------------| | C-c C-z | Start Scheme REPL, or jump to previous buffer | | C-c M-o | Clear scheme output | | C-c C-q | Kill Scheme process | | C-c C-k | Nuke REPL: use it if the REPL becomes unresponsive | |-------------+----------------------------------------------------| | M-. | Edit identifier at point | | TAB, M-TAB | Complete identifier at point | | M-`, C-. | Complete module name at point | | M-p, M-n | Prompt history, matching current prefix | |-------------+----------------------------------------------------| | C-c C-m | Set current module | | C-c C-i | Import module into current namespace | | C-c C-r | Add a given directory to scheme's load path | |-------------+----------------------------------------------------| | C-c C-d C-d | See documentation for symbol at point | | C-c C-d C-m | See documentation for module | | C-c C-d C-a | Toggle autodoc mode | |-------------+----------------------------------------------------| ** In the documentation browser: |----------+----------------------------------------------| | f | Next page | | b | Previous page | |----------+----------------------------------------------| | TAB, n | Next link | | S-TAB, p | Previous link | | N | Next section | | P | Previous section | |----------+----------------------------------------------| | k | Kill current page and go to previous or next | | g, r | Refresh page | | c | Clear browsing history | |----------+----------------------------------------------| | ., M-. | Edit identifier at point | | z | Switch to REPL | |----------+----------------------------------------------| | q | Bury buffer | |----------+----------------------------------------------| ** In backtrace (evaluation/compile result) buffers: - M-g n, M-g p, C-x ` for error navigation. - q to bury buffer. geiser-0.8.1/ChangeLog0000644000175000017500000144250412607252050011502 00000000000000commit c6f17b25200e36f80d812684a2127b451fc11817 Author: Jose Antonio Ortega Ruiz Date: Tue Oct 13 20:53:45 2015 +0200 Version 0.8.1 NEWS | 4 ++++ configure.ac | 2 +- doc/macros.texi | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) commit 733ea7a4ed1f527b70764a52fe865926d90f5177 Author: Jose Antonio Ortega Ruiz Date: Tue Oct 13 20:47:38 2015 +0200 Oops: font-lock-ensure is from the future Should fix #105 elisp/geiser-syntax.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit 25810009873b9b9acdfc3a291ea7c3ec75ab018f Author: Jose Antonio Ortega Ruiz Date: Mon Oct 12 12:36:23 2015 +0200 download-mirror.savannah.gnu.org ftw Seems this site is updated better than the canonical download.savannah.gnu.org (which depends on mirror propagation). doc/macros.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 31ceeeb942bcfc0336189e275e92e20b0b8b00a7 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 12 12:21:48 2015 +0200 Version 0.8 released AUTHORS | 6 +++++- NEWS | 16 ++++++++++++++++ THANKS | 3 +++ configure.ac | 2 +- doc/macros.texi | 8 ++++---- doc/thanks.texi | 3 +++ 6 files changed, 32 insertions(+), 6 deletions(-) commit 2c8e3e042ef8da63550fec3982b462773acafe17 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 12 12:04:27 2015 +0200 So font-lock-fontify-buffer is for interactive use Fixed by using font-lock-ensure instead elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 48ba8943e8ad63f778cf89b6e7dc41313127fffb Author: Jose Antonio Ortega Ruiz Date: Mon Oct 12 12:02:18 2015 +0200 Keeping the elisp compiler happy Mainly by reordering definitions so that functions are not used before defined. There are a couple of places where the compiler and I disagree (it complains withing eval-after-load), and a valid complain about functions defined via geiser-popup--define that should be addressed). elisp/geiser-debug.el | 3 ++- elisp/geiser-eval.el | 28 ++++++++++++++-------------- elisp/geiser-racket.el | 4 +++- elisp/geiser-repl.el | 3 +-- elisp/geiser-syntax.el | 36 ++++++++++++++++++------------------ 5 files changed, 38 insertions(+), 36 deletions(-) commit 697d0ac94d2d63bf755931122beafcbe1304b321 Merge: 373b9a4 5b2bd49 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 5 15:40:17 2015 +0200 Merge remote-tracking branch 'alezost/indent+highlight' commit 373b9a499dd4f26886c0e54612e638dd529bcc6f Author: Dan Leslie Date: Sat Oct 3 21:33:21 2015 -0700 Stopped over-aggressive memoization It doesn't make sense to memoize the following: geiser-start-server geiser-macroexpand scheme/chicken/geiser/emacs.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 466df84526032315d119b48f95d9e70ab707133e Author: Dan Leslie Date: Sat Oct 3 19:39:18 2015 -0700 Minor improvements Removed the unnecessary csi reference Added a flag to force build an so elisp/geiser-chicken.el | 2 +- scheme/chicken/geiser/emacs.scm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) commit bb7b181ecfd6ba588b19fd896345fcf39e242345 Author: Dan Leslie Date: Sat Oct 3 14:35:03 2015 -0700 Turn off debug log scheme/chicken/geiser/emacs.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit ea8d1f97119bdd058ae918ca7f7fcb3279b70a7f Author: Dan Leslie Date: Sat Oct 3 14:34:21 2015 -0700 Adds memoization Clears memo when anything other than a safe geiser call is made. Removes the last calls to regex within the thing scheme/chicken/geiser/emacs.scm | 50 ++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 14 deletions(-) commit 57d6934beb882c6dcd7119f7a2ebe04ab977b9c5 Author: Dan Leslie Date: Sat Oct 3 12:39:05 2015 -0700 Converts toplevel methods to prefixed methods This seems to improve speed; in a large environment I witnessed a regular 100ms increase in speed for autodoc. elisp/geiser-chicken.el | 34 +++++------- scheme/chicken/geiser/emacs.scm | 114 ++++++++++++----------------------------- 2 files changed, 46 insertions(+), 102 deletions(-) commit d109d97c262e1e20de62bfdd74f421f911494405 Author: Dan Leslie Date: Thu Oct 1 22:39:44 2015 -0700 Refactored to reduce the reliance on regex. Improves speed by an order of magnitude. scheme/chicken/geiser/emacs.scm | 311 ++++++++++++++++++++--------------------- 1 file changed, 152 insertions(+), 159 deletions(-) commit 5b2bd49f2c9bb7cea8c63485e40d267ea27bace0 Author: Alex Kost Date: Sat Oct 3 17:05:01 2015 +0300 Add missing highlighting for 'syntax-case' elisp/geiser-syntax.el | 1 + 1 file changed, 1 insertion(+) commit f65b3b1df4f7e6f6e281272ac61262444e59979e Author: Alex Kost Date: Sat Oct 3 16:45:43 2015 +0300 Add more highlighting/indentation for Guile elisp/geiser-guile.el | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) commit 3cef425f712f16fb4d2352c6e81664c3bda1e231 Author: Alex Kost Date: Sat Oct 3 16:31:41 2015 +0300 Add highlighting/indentation for tests API for test suites is defined by SRFI-64. elisp/geiser-syntax.el | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) commit ece49d5bd0692bc8373a8b024909530d0db67cde Author: Alex Kost Date: Sat Oct 3 16:23:51 2015 +0300 Add highlighting/indentation for exceptions Exceptions are defined by R6RS, SRFI-18 and SRFI-34. elisp/geiser-syntax.el | 3 +++ 1 file changed, 3 insertions(+) commit dc9be78f1fad878cbc245abce8d331a51ca50fc5 Author: Jose Antonio Ortega Ruiz Date: Wed Sep 30 02:40:20 2015 +0200 Follow suit and complete quoted symbols in all schemes I kind of dislike completion on symbols, because a quote reads to me as 'stop evaluating', and a symbol per se has infinite possible conversions. But, on the other hand, not completing has no practical advantage, and, moreover, we're already completing symbols inside quoted lists (e.g. try M-TAB next to `'(defi`)), so my prejudices are not even consistent. So here we go! elisp/geiser-chicken.el | 8 +++++--- elisp/geiser-guile.el | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) commit 04010556fa1c0043472048516a70044c8850d45d Author: Mario Rodas Date: Mon Sep 28 19:48:52 2015 -0500 Skip expression quote when getting a racket symbol elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 7ae1d4b3e6464f0a8b3416f6689c8b44ceb5bc42 Merge: 424553e ccfd1fb Author: Jose Antonio Ortega Ruiz Date: Wed Sep 30 02:27:13 2015 +0200 Merge remote-tracking branch 'dleslie/master' commit ccfd1fbab2f246d60b9efb804516db5ab88be6ab Author: Dan Leslie Date: Sun Sep 27 09:19:22 2015 -0700 Limits search to the line beginning - Also adds page breaks to geiser-chicken.el elisp/geiser-chicken.el | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) commit 424553e017718c54e219212b27a32b341ec6bd28 Author: Alex Kost Date: Sun Sep 27 11:57:48 2015 +0300 Clean up indentation rules Move general indentation rules to "geiser-syntax". elisp/geiser-chicken.el | 64 ++++++++++++++++---------------------------------- elisp/geiser-guile.el | 9 ++++++- elisp/geiser-syntax.el | 13 ++++++---- 3 files changed, 37 insertions(+), 49 deletions(-) commit 07186d3049ccdf5bb2e50fd4287a52b6e1545626 Author: Alex Kost Date: Thu Sep 24 22:16:49 2015 +0300 Add 'geiser-guile--builtin-keywords' elisp/geiser-guile.el | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) commit d1eb6e006cfaa1223482935110b6ac8f80e87e09 Author: Alex Kost Date: Thu Sep 24 21:28:07 2015 +0300 Use 'geiser-chicken-extra-keywords' elisp/geiser-chicken.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 66f90b13486f3d1e4f986c9746467cf8dcafdaad Author: Alex Kost Date: Thu Sep 24 21:19:25 2015 +0300 Add general font-lock keywords for all implementations Move general RNRS/SRFI keywords from "geiser-chicken" to "geiser-syntax". elisp/geiser-chicken.el | 42 ++++++++++++++++++++++++++++++------------ elisp/geiser-syntax.el | 43 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 64 insertions(+), 21 deletions(-) commit 2b7e3aa00afebe454bea26f54d31847e178c3c33 Author: Alex Kost Date: Wed Sep 16 21:34:24 2015 +0300 Add 'geiser-syntax--simple-keywords' Use this function instead of repeating the same code in each implementation. elisp/geiser-chicken.el | 2 +- elisp/geiser-guile.el | 4 +--- elisp/geiser-racket.el | 5 +---- elisp/geiser-syntax.el | 6 ++++++ 4 files changed, 9 insertions(+), 8 deletions(-) commit 59f140f19b36ce273e3a0f955597469d5192c209 Author: Dan Leslie Date: Fri Sep 25 21:14:21 2015 -0700 Adds the ability to have sub-word delimiters Many chickeners use prefixes when importing eggs, which breaks completions. This commit adds the ability to define custom prefix delimiters, with : and # pre-defined due to their common usage. elisp/geiser-chicken.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) commit 9a3d363ee0b2921a5f1479a06deab9bb26b9bee9 Author: Alex Kost Date: Wed Sep 16 16:29:24 2015 +0300 Remove Geiser faces from 'faces' custom group elisp/geiser-custom.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) commit 8224381c5d7ecdfd2339d94e2aba9a0bfb8d3240 Author: Alex Kost Date: Wed Sep 16 16:19:36 2015 +0300 Add 'geiser-repl-buffer-name-function' variable elisp/geiser-repl.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) commit d075d57edd2f005fe81380541266fcb46352401c Author: Dan Leslie Date: Sun Sep 13 09:49:43 2015 -0700 Sorted and line-split crunch symbols. scheme/chicken/geiser/emacs.scm | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) commit f4447743c3794b154b34ba3e81554ec35563739a Author: Dan Leslie Date: Fri Sep 11 22:50:52 2015 -0700 Added missing macros scheme/chicken/geiser/emacs.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 6bf9a257077dadf04ba3a900f957fe4aad70fc2c Author: Dan Leslie Date: Fri Sep 11 22:26:52 2015 -0700 Adds recognition of the 'crunch' R5RS subset Crunch is a subset of R5RS that the crunch egg can heavily optimize via c++ compilation. This change allows geiser to report to chicken programmers whether the function is found within that subset, easing development. Details on the crunch egg can be found at: http://wiki.call-cc.org/eggref/4/crunch scheme/chicken/geiser/emacs.scm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) commit 4c06bb5212bcf194fa61ac331a89094834622b67 Author: Alex Kost Date: Thu Sep 10 10:27:49 2015 +0300 Update .gitignore .gitignore | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) commit db8ab30c7587616edd99cb90bfdfa77fe4e702ac Author: Jose Antonio Ortega Ruiz Date: Thu Sep 10 04:22:10 2015 +0200 Speeding up debugger check (addresses #64) Soooo, the long delay experienced when evaluating long string lists in Guile had nothing to do with the time took by emacs to read the response from the scheme process; that process is always a breeze, no matter or its format or number of newlines. The delay was provoked by an innocent looking function that scans the received string (which includes a prompt at the end as an EOT marker) to check whether Guile (or any other scheme) has just entered the debugger (that's done inside `geiser-con--connection-update-debugging`). For some reason, `string-match` on that kind of string using Guile's regexp for a debug prompt takes forever. Instead of trying to optimize the regular expression, i've just applied it to the *second* line of the received string, which is the one that contains the response's prompt. elisp/geiser-connection.el | 14 ++++++-------- scheme/guile/geiser/evaluation.scm | 8 ++------ 2 files changed, 8 insertions(+), 14 deletions(-) commit 4f31a25509f5d4a93559a3feb751cdfbef0464b5 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 10 03:08:34 2015 +0200 Fix for geiser-connect-local This one should address #79. I'm very surprised this ever worked! elisp/geiser-repl.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) commit 34102210e188716a0047edd7c87fdee652301f2c Author: Jose Antonio Ortega Ruiz Date: Thu Sep 10 02:08:11 2015 +0200 Moving implementation loading to geiser-repl (#82) That way we avoid circularities in the load graph, always a good thing. elisp/geiser-impl.el | 5 ----- elisp/geiser-repl.el | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) commit ded125032b9e84d942a818b47383674e60e37a00 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 10 02:06:36 2015 +0200 Redundant provide in define-geiser-implementation This is gone now, since we're diligent enough to always end our impl definitions with an explicit provide form. See PR #87 for a bit of discussion. elisp/geiser-impl.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) commit 86625ae52aae61a7ed836fd9d0c0a955fa151b1e Author: Jose Antonio Ortega Ruiz Date: Wed Sep 9 18:30:36 2015 +0200 Whitespace elisp/geiser.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 24acd9f971afa36a9e9e11a48bcef6c699e497fa Author: Christoph Egger Date: Wed Sep 9 17:40:04 2015 +0200 Autoload geiser-connect-local as well elisp/geiser.el | 4 ++++ 1 file changed, 4 insertions(+) commit 8eb2aafedbb2a65a69a830814da61395cf276c54 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 8 23:51:21 2015 +0200 Ensuring switch-to-geiser asks for an implementation Should fix issue #85 elisp/geiser-repl.el | 5 +++-- scheme/guile/geiser/evaluation.scm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) commit e19dde931f9ec768d142a3f2c7bb4b6779ac4d4a Author: Alex Kost Date: Sun Sep 6 21:55:36 2015 +0300 Add highlighting for geiser-custom--defcustom/defface elisp/geiser-custom.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) commit 9356155e725ef185a211cf577126aca421a2a708 Author: Alex Kost Date: Sun Sep 6 18:05:24 2015 +0300 repl: Add 'save-history' argument to 'geiser-repl--send' elisp/geiser-repl.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) commit bd42523b61ff81dae4bf585fc2fabda4a94d8bd3 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 3 04:21:50 2015 +0200 guile: pretty printing evaluation results (#64) We use the same trick as chicken for guile, and pretty-print the evaluation results before writing them. The trick wasn't working at all until i specified a value for the undocumented keyword parameter `#:max-expr-width`, which makes me think i might be missing something. scheme/guile/geiser/evaluation.scm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) commit 66445547c881ed7b6b504c7d6d3e522e2833ab24 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 3 03:15:45 2015 +0200 Fixes for elpa make target (issue #78) Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) commit 42f70b098aaed948de64891165c8cbeebd61b230 Author: Dan Leslie Date: Tue Sep 1 21:13:32 2015 -0700 Add compiled .so caching to Chicken support - Now give compile-file a reasonable destination for the output - Check for aforementioned output and skip the compile if exists - None of the above happens if the system-type is 'windows-nt, which may not be a necessary restriction. And, the existing geiser-chicken-compile-geiser-p var applies. Resolves jaor/geiser#73 for non-windows system elisp/geiser-chicken.el | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) commit ef3a1a51cf88ff9a86f79d90c71c70d059f934a7 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 31 17:26:07 2015 +0200 Kill those TABs elisp/geiser-chicken.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 8c821139d99133a02055e10ed0a070c2beab25cc Merge: 76d42a9 62c16d8 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 31 17:22:18 2015 +0200 Merge remote-tracking branch 'dleslie/proper-windows-loading' commit 76d42a938e46847b66fd5bdbb6706c95500798fb Merge: 280902e b232512 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 31 17:18:31 2015 +0200 Merge remote-tracking branch 'dleslie/faster-output-handling' commit 280902e4dbd68e3b74f0d2caa4963aa79e201095 Author: Dan Leslie Date: Sat Aug 29 10:22:16 2015 -0700 The issue arose with numerics, as well. This change should fix it for most any input. scheme/chicken/geiser/emacs.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 17331d7f58d257107ba8e64a3053bb6edda639f7 Author: Dan Leslie Date: Sat Aug 29 10:01:16 2015 -0700 Fixes an issue where symbol->string was failing In some instances apropos-information-list returns a string and not a list of symbols; this is the case for Chicken's builtins, like C_plus. IE, the following would fail: (geiser-autodoc #f '(+)) This fixes jaor/geiser#72 scheme/chicken/geiser/emacs.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b232512c4d7bffae7f2ac8302c3136a637910264 Author: Dan Leslie Date: Fri Aug 28 16:47:12 2015 -0700 Use pretty-print instead of write with Chicken Emacs chokes on buffers with very long lines. Use of pretty-print instead of write causes most incidents of long lines to be avoided by use of better formatting. This fixes jaor/geiser#64 for Chicken, and appears to greatly speed up completions in the general case for Chicken. scheme/chicken/geiser/emacs.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 62c16d82511bdda7883947ac0b93d8a5dd20d538 Author: Dan Leslie Date: Fri Aug 28 16:43:48 2015 -0700 Adds necessary parameter to csi for Windows. -:c is required to make csi behave nicely with Emacs on Windows. This ought to resolve jaor/geiser#67 elisp/geiser-chicken.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 334db07445e9594632c7270587c4503ec8713967 Author: Dan Leslie Date: Thu Aug 27 22:25:04 2015 -0700 Now suppress loading messages Chicken won't become available to Geiser until it's actually done loading. A number of bugs are related to this, including jaor/geiser#68 but also some quizzically flaky completion behaviour. The fix is to suppress output to STDOUT until Chicken is ready; output to STDERR is not suppressed, so if bad things happen it will still appear in the geiser messages buffer. This may fix jaor/geiser#68 elisp/geiser-chicken.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) commit 0f66c250245af1348a3ee5a698c69ec4245e2194 Author: Jose Antonio Ortega Ruiz Date: Fri Aug 14 21:44:46 2015 +0200 Don't try to turn on geiser-mode in non-scheme buffers xscheme defines its own scheme-interaction-mode that, quite rudely if you ask me, calls not only its hooks, but also scheme-mode's. Among them, turn-on-geiser-mode, causing havoc to users of xscheme's run-scheme function. We, ahem, fix this problem by checking that we're actually in scheme-mode when our hook is called. Thanks to Federico Beffa for his reports. elisp/geiser-mode.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) commit bfb4a8fce5828d15641164b475b830031c6d3335 Author: Dan Leslie Date: Fri Aug 14 08:27:05 2015 -0700 Modifies geiser--cut-version regex Minor and Patch versions are now optional. elisp/geiser-base.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit bfbaaf707f82027e05ea4cfee5d31f2f8eb64690 Author: Dan Leslie Date: Fri Aug 14 08:18:59 2015 -0700 Closes jaor/geiser#65 geiser--cut-version only supports single-digit minor versions. - Improves the regex to support multiple-digit minor versions. Contributed by @kovrik elisp/geiser-base.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) commit 7866c31f267d0ecdf94ed90d2724fed20dc149dc Author: Mario Domenech Goulart Date: Tue Jun 30 21:56:42 2015 -0300 geiser-chicken.el: add indentation rule for `with-output-to-pipe' Signed-off-by: Mario Domenech Goulart elisp/geiser-chicken.el | 1 + 1 file changed, 1 insertion(+) commit 7b049cf784bfc06bd90c3ad8b15e2a0304fb55db Author: Dan Leslie Date: Sun May 17 17:14:53 2015 -0700 Various improvements - Can now optionally compile Geiser components for enormous speed improvements; enabled by default - Apropos was returning many duplicates, which was causing slowdowns; duplicates are now filtered - Now check for # results and return something - Fixed a typo in a comment - Fixed a typo in calling string-length elisp/geiser-chicken.el | 15 ++++++++++++--- scheme/chicken/geiser/emacs.scm | 26 ++++++++++++++++---------- 2 files changed, 28 insertions(+), 13 deletions(-) commit 62ba8d319880e824dd17bfccb480483aa577109c Author: Dan Leslie Date: Wed May 6 18:25:49 2015 -0700 Compile instead of Load, should speed up. elisp/geiser-chicken.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 666a28f1ff0914916b7a46bc30846c629235a5af Author: Jose Antonio Ortega Ruiz Date: Thu Mar 12 03:18:47 2015 +0100 Fix for RET with point at the beginning of line after M-p elisp/geiser-repl.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit b695e11602abf10b9a4b1cf8b234f87ee1e915f2 Author: Jose Antonio Ortega Ruiz Date: Wed Mar 4 00:09:45 2015 +0100 Using font-lock-variable-name-face in lieu of bold for autodoc For some X faces, a bold string in the modeline causes emacs to widen it to two lines, which is kind of annoying. The default value of font-lock-variable-name-face on color/X displays doesn't include any boldness, and will probably improve the default experience of new users. Thanks to Mario Domenech Goulart for noticing this and the previous one! elisp/geiser-autodoc.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit f80f48ac7c00b4d0539c9a8f94e8f047482f930a Author: Jose Antonio Ortega Ruiz Date: Tue Mar 3 23:46:46 2015 +0100 Bogus mention to geiser-impl-installed-implementations removed It should have been geiser-active-implementations since ages ago. README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit f4a6025416ee5544d1c1ecc4389829d9f3ae8e40 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 23:39:38 2015 +0100 Oops: missing date NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit fbd43f27d26cb0c40d2a2d6ede7752575e453e13 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 06:38:54 2015 +0100 Preparing 0.7 configure.ac | 4 ++-- doc/geiser.texi | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit 3dd68414304fede65cb3f0c7951d813bb7b0f792 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 04:14:49 2015 +0100 Documentation updates and nits for Freija Preparing the release of 0.7, which will feature support for Chicken thanks to Dan and Freija! AUTHORS | 5 +- NEWS | 10 +++- README | 13 ++++- README.elpa | 2 +- THANKS | 4 ++ doc/install.texi | 14 ++++- doc/intro.texi | 14 +++-- doc/macros.texi | 12 ++-- doc/repl.texi | 55 +++++++++--------- doc/thanks.texi | 4 ++ elisp/geiser-base.el | 4 +- elisp/geiser-chicken.el | 18 +++--- elisp/geiser-impl.el | 2 +- elisp/geiser.el | 2 +- scheme/chicken/geiser/emacs.scm | 129 ++++++++++++++++++++++------------------- 15 files changed, 169 insertions(+), 119 deletions(-) commit 383585e44e56be0e690ad96895f73abf8454d3be Author: Dan Leslie Date: Thu Nov 20 17:36:50 2014 -0800 Initial Chicken support AUTHORS | 1 + INSTALL | 10 + Makefile.am | 3 + README | 4 + README.elpa | 12 + elisp/Makefile.am | 1 + elisp/geiser-chicken.el | 295 ++++++++++++++++++ elisp/geiser-impl.el | 2 +- elisp/geiser.el | 12 + scheme/Makefile.am | 3 +- scheme/chicken/geiser/emacs.scm | 665 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 1006 insertions(+), 2 deletions(-) create mode 100644 elisp/geiser-chicken.el create mode 100644 scheme/chicken/geiser/emacs.scm commit ebbb1f69de76d8dac705ef3b977b1598572b87f7 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 19 03:34:25 2015 +0100 NEWS update NEWS | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit 7b9383db986ee9ed9ab5287af64440ae1f94dfd7 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 19 02:46:00 2015 +0100 Not cleaning the image cache before displaying images Image cache cleaning was being performed during comint output filtering and, since that can happen in batches, if the total output had more images than the maximum cache size, some of them would be gone (in fact it was even worse: we were cleaning the cache after each image display). Now we just perform cache maintenance before sending the input, and avoid paying a price for non-rackets by making the cache dir setting implementation-specific. elisp/geiser-image.el | 38 +++++++++++++++++++------------------- elisp/geiser-racket.el | 10 ++++++++-- elisp/geiser-repl.el | 3 ++- 3 files changed, 29 insertions(+), 22 deletions(-) commit 27b7eacc9c062328d189337e02c2229b4be3e3c7 Author: Jose Antonio Ortega Ruiz Date: Wed Dec 31 20:18:19 2014 +0100 Racket: displaying graphics in structured objects By hooking the pretty-printer, as discovered by Greg in issue #49. To attain nirvana, we would still need (display (list graph)) to work... scheme/racket/geiser/images.rkt | 15 ++++++++++++++- scheme/racket/geiser/user.rkt | 8 ++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) commit 0dbd605e631beea9b46f526deda2a7d05928c49f Author: Jose Antonio Ortega Ruiz Date: Mon Dec 29 02:46:12 2014 +0100 Racket: show images with print, write and display Up to now, we were only displaying images when printed as values by the REPL, but not when image values were explicitly print-ed, write-d or display-ed. This patch solves that problem by installing (semi) appropriate port-{print,write,display}-handler. This is still and incomplete solution in that those handlers (as well as the already installed current-print-handler) don't recurse over a value's structure and won't produce images embedded in other data structures, as discussed in issue #49. scheme/racket/geiser/images.rkt | 11 +++++++++-- scheme/racket/geiser/user.rkt | 13 ++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) commit a1c1f48872801ed47ec056fffc585011a068907b Author: Jose Antonio Ortega Ruiz Date: Sat Nov 1 03:51:05 2014 +0100 New MELPA URLs doc/install.texi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) commit fe869d21f9a2a5c81b0740aaa809205a019faf3f Author: Henry Till Date: Mon Oct 6 14:47:28 2014 -0400 remove geiser-mode--maybe-activate from scheme-mode-hook on geiser-unload elisp/geiser-reload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 1d1e209999ae7b3d1a5016fdf00ec7206965d1b2 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 23 03:25:51 2014 +0200 A NEWS update Since we have so few, let's not wait to add just one more! NEWS | 6 ++++++ 1 file changed, 6 insertions(+) commit 8658dc2e8dd89eb21cd035f7a16af10285f99566 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 23 03:20:50 2014 +0200 A better name for geiser-doc-symbol--fill-current-symbol Which moreover complies with the unwritten naming conventions we use: geiser-doc--render-docstring. elisp/geiser-company.el | 4 ++-- elisp/geiser-doc.el | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) commit 354b09ca1d7e1f830bbe3875f1a0a7fc24b14b4d Author: Profpatsch Date: Mon Sep 15 16:49:47 2014 +0200 company: implement --doc-buffer elisp/geiser-company.el | 12 +++++++++++- elisp/geiser-doc.el | 27 +++++++++++++++------------ 2 files changed, 26 insertions(+), 13 deletions(-) commit 270e94ec59594a9ca43d09e4e841528e030129ff Author: Jose Antonio Ortega Ruiz Date: Sat Aug 30 20:46:28 2014 +0200 I meant Marmalade, of course. MELPA stable seems better. doc/install.texi | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) commit e396c98f49448afe1584fb2be3e0a648acba3598 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 10 01:45:29 2014 +0200 MELPA is hopeless (at least for the time being) doc/install.texi | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) commit 637980cc26cb47c34ef6e35d0d2fde51aafe7fbb Author: Jose Antonio Ortega Ruiz Date: Sun Aug 10 00:57:37 2014 +0200 NEWS for 0.6 NEWS | 2 +- configure.ac | 4 ++-- doc/macros.texi | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) commit 7cf34c0c92cac3039849b8be40b468d0c52d2472 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 5 06:14:44 2014 +0200 Possible fix for scanning problem Apparently, the nesting level returned by emacs's syntax parser can be negative (presumably when it gets confused), and we were not avoiding calling backward-up-list when that happened. Could or could not address issue #41... elisp/geiser-guile.el | 4 +--- elisp/geiser-racket.el | 4 +--- elisp/geiser-syntax.el | 9 ++++++--- 3 files changed, 8 insertions(+), 9 deletions(-) commit f7c97ae42913e22df4532aa820a07751a5e8c71e Author: Jose Antonio Ortega Ruiz Date: Tue Jun 3 03:10:23 2014 +0200 Guile: font lock for all components of module names elisp/geiser-guile.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit f55181bc0f231ca54ad40267aa2f75e4e5cf4055 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 1 01:17:32 2014 +0200 A bit of NEWS NEWS | 5 +++++ 1 file changed, 5 insertions(+) commit c961e6097c896b952bf6ccbb8ebbb794c8d50294 Author: Jose Antonio Ortega Ruiz Date: Sat May 31 23:52:26 2014 +0200 Almost redundant REPL command to interrupt evaluation Works almost identically to the stock C-c C-c, with just marginally better output aaand being well behaved when interrupting infinitely looping functions such as (define (f) (newline) (let loop () (loop))) -- cf. issue #29 on github. We like it so much that it replaces the old one. doc/cheat.texi | 3 +++ elisp/geiser-repl.el | 8 ++++++++ 2 files changed, 11 insertions(+) commit 9ff03facb2ea1e0a6b320f603dfd7e0e787d9593 Author: Jose Antonio Ortega Ruiz Date: Sat May 31 20:54:22 2014 +0200 Finer control of debugging window popups It's now possible to control whether we jump to the debug window on evaluation errors (geiser-debug-jump-to-debug-p) and whether we show it all (geiser-debug-show-debug-p). NEWS | 5 +++++ doc/parens.texi | 6 ++++++ elisp/geiser-debug.el | 33 ++++++++++++++++++++++++++++----- elisp/geiser-racket.el | 7 ++++--- 4 files changed, 43 insertions(+), 8 deletions(-) commit 30c3c30774fc16e5ec342bc5eeca21c277a56107 Author: Jose Antonio Ortega Ruiz Date: Sat May 31 18:54:11 2014 +0200 Fix for apparently stolen link to texinfo doc/geiser.texi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 586d552350c04f4025ce99d2600bf89496db6e31 Author: Jose Antonio Ortega Ruiz Date: Sat May 31 05:37:09 2014 +0200 Making makeinfo html-happy Fixes for warnings issued by makeinfo 5.x (when using some of our macros: the guy is touchy regarding @ifhtml and new lines) that were preventing the install-html make target to work (for people that want local html by texinfo as opposed to the (supposedly fancier) texi2html-generated version we use for the web). doc/parens.texi | 18 ++++++++++++------ doc/repl.texi | 13 ++++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) commit 5020b91e90520a9e5c0c725123247535dfb60a4f Author: Diogo F. S. Ramos Date: Wed Mar 26 03:22:12 2014 -0300 Indent Guile's `with-mutex' Follow the convention for `with-' procedures. elisp/geiser-guile.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 13f2aa64d2bd61f1338073d913b354d88ae3e4c2 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 7 13:25:02 2014 +0100 Fontify when too (thanks to Diogo) elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit aefaae3c8af9d31c12411073dba7749f194bd749 Author: Diogo F. S. Ramos Date: Fri Feb 28 18:03:51 2014 -0300 Disable error in `define-syntax-rule' font lock This allows partially matched `define-syntax-rule' expressions and avoids the termination of search-based fontification, which affects other expressions inside the buffer, in the case of a missing subexpression. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit c74baab7509c68e0db09870954a8de3a3e7727aa Author: Diogo F. S. Ramos Date: Fri Feb 28 17:43:35 2014 -0300 Highlight `define-once' Guile's `define-once' allows defining a variable only once, but its syntax is different from `define', so its highlight is different. elisp/geiser-guile.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) commit d903e2c8df9dc7b02e1e89d135b961810914005d Author: Ludovic Courtès Date: Tue Feb 18 17:25:44 2014 +0100 Add 'geiser-connect-local' to connect over Unix-domain socket. elisp/geiser-repl.el | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) commit e279622a64a42aedfcc388ff4df45319f76f794d Author: Jose Antonio Ortega Ruiz Date: Tue Feb 25 00:48:28 2014 +0100 Using font-lock-function-name-face for define-syntax-rule The name defined It's more like a function in a define than a variable, since it can take arguments. elisp/geiser-syntax.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 5fddde9ef9dc53fd3cc8aacda4f0ed5a9c3a2e52 Author: Diogo F. S. Ramos Date: Mon Feb 24 17:46:50 2014 -0300 Font lock `define-syntax-rule' like `define' procedures `define-syntax-rule' is similar enough to procedure definitions that it should be highlight as a slightly different version of one. The faces were chosen to keep the same scheme used by `define-macro'. `define-syntax-rule' was removed from Racket's extra keywords as there is no need to special case it. elisp/geiser-racket.el | 3 +-- elisp/geiser-syntax.el | 8 ++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) commit c00e7678d97beb0107740e408263931b88449886 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 18 05:41:04 2014 +0100 Racket: no more re-enter notifications (issue #25) scheme/racket/geiser/enter.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 1839c4042013ae2a4002e228ca2ee8bf295190d3 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 18 05:10:08 2014 +0100 Racket: fix for recompilation of typed/racket modules When using our current-load/used-compiled function, we were compiling the syntax of a module using compile, which seems to not honour With luck, this should address bug #14 for real. scheme/racket/geiser/enter.rkt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) commit f9b2ed86077a79718b083e49f752cf01457e1459 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 10 06:20:05 2014 +0100 Racket: better behaviour of geiser-eval-buffer For buffers containing a #lang directive, geiser-eval-buffer was simply broken: one cannot send the whole region wrapped in a `begin' in that case. We try now to send the region below, although a real solution would imply using #%module-begin as the wrapper, in order to be robust for languages that define their own version of the macro (such as TR). But people should use C-c C-a or C-c C-k and leave this silly function alone instead. NEWS | 3 +++ elisp/geiser-mode.el | 21 +++++++++------------ elisp/geiser-racket.el | 10 +++++++--- 3 files changed, 19 insertions(+), 15 deletions(-) commit 826a054761d0f12f243883a001b2392279580a7f Author: Jose Antonio Ortega Ruiz Date: Thu Jan 9 00:48:57 2014 +0100 Racket: fix for evaluations inside typed/racket modules When evaluating (re)definitions in a typed module, it's necessary that the form evaluated is wrapped with #%top-interaction, so that typed racket's redefinition of that macro enters into play and the system records the type information of the new value. Many thanks to Sam Tobin-Hochstadt for the tip, and for his encouraging words. NEWS | 7 +++++++ scheme/racket/geiser/eval.rkt | 7 ++++--- scheme/racket/geiser/user.rkt | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) commit 4bb12c208bab5740fdfa0f77b5c2b279fb941b99 Author: Jose Antonio Ortega Ruiz Date: Thu Jan 9 00:47:30 2014 +0100 Racket: duplicate version check removed We used to check for a good racket version during its start-up, but these days we already have an independent version check before that. scheme/racket/geiser/startup.rkt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) commit c676e0f23f4fd039e512056ee3cf2f268eef71f7 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 9 03:08:31 2013 +0100 Version 0.5 NEWS | 2 +- doc/macros.texi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 9b1244055e355d057ba2cd22da1412139963b68a Author: Jose Antonio Ortega Ruiz Date: Mon Sep 30 05:15:33 2013 +0200 Learning to write doc/install.texi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit bb45bdb6e640f36ac3265db6cfc5aa9a78cf00cf Author: Jose Antonio Ortega Ruiz Date: Mon Sep 30 04:39:35 2013 +0200 Mentioning Xiao Hanyu's ac-geiser package in the docs doc/install.texi | 9 +++++++++ 1 file changed, 9 insertions(+) commit 0529e5a684e274eb27277329eb36d5b44f0a75d2 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 26 19:08:19 2013 +0200 Checking for versions before creating the REPL buffer ... so that we don't end up with a blank, useless buffer around. elisp/geiser-repl.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) commit bf3f1750579e88c4e636855f912a2138fbd0f632 Author: Jose Antonio Ortega Ruiz Date: Wed Sep 25 05:15:13 2013 +0200 Credit where credit is due NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 2cb40f5a1f0115a995daa176208f76b674dd523e Author: Jose Antonio Ortega Ruiz Date: Wed Sep 25 05:10:00 2013 +0200 Scheme version checks And, if you happen to be launching it all the time, a way of skipping them via a customizable variable. Should address issue #15. NEWS | 3 ++- doc/repl.texi | 23 +++++++++++++++++------ elisp/geiser-base.el | 11 ++++++++++- elisp/geiser-guile.el | 7 +++++++ elisp/geiser-racket.el | 9 ++++++++- elisp/geiser-repl.el | 25 +++++++++++++++++++++++++ 6 files changed, 69 insertions(+), 9 deletions(-) commit 438e26d9e1759b85785637efc0b64e818e289e57 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 19 18:24:00 2013 +0200 News about MELPA support NEWS | 6 +++++- doc/install.texi | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) commit b6f8a04bfd53cd4fd77533a1f7a1d1db028ed8fd Author: Steve Purcell Date: Thu Sep 19 08:29:16 2013 +0100 Fix file headers and footer for ELPA compatibility This will allow `package-buffer-info` to parse the description out of the file. elisp/geiser.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 832cacddb963a3ae0e11acf007bd16164b5f8121 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 19 03:24:55 2013 +0200 Missing autoload cookies for MELPA Everything in geiser.el needs one, so that the generated geiser-autoloads.el initializes variables and the like properly automatically. elisp/geiser.el | 3 +++ 1 file changed, 3 insertions(+) commit 0238bdb00116c7fce43dd982ba69c1d6ef9ebc42 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 19 02:37:06 2013 +0200 Paving the way to MELPA (and simpler ELPA generation) Following the discussion in GitHub, i'm adding an alternative scheme path to geiser.el as well as ##autoload cookies. As a first benefit, this simplifies a bit the elpa target, after playing a similar path trick in bin/geiser-racket.sh. Things should be almost ready for creating a MELPA recipe. Makefile.am | 20 ++++++++------------ bin/geiser-racket.sh | 5 ++++- elisp/geiser.el | 26 ++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 15 deletions(-) commit 217d2b5948b23a87efa3c617fdf213127e5acc15 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 19 02:19:45 2013 +0200 Fix: not using mapcar for effect elisp/geiser-guile.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) commit 4fdfd9d971888bba41bc46919792a28c478573de Author: Jose Antonio Ortega Ruiz Date: Tue Sep 17 19:06:12 2013 +0200 Docs: it's package-install, not install-package doc/install.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 393305d2fcf612f4e5f99383f680f819b458c326 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 13 20:36:56 2013 +0200 Guile: augmenting %load-compiled-path too We add the paths in geiser-guile-load-path also to %load-compiled-path, and new directories added to the load path via geiser-add-to-load-path are added to both %load-path and %load-compiled-path. Here's hope Ludovic will like all these additions! elisp/geiser-guile.el | 13 ++++++++----- scheme/guile/geiser/evaluation.scm | 15 +++++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) commit ba42cac06db062d5392342930d3d175c1d3cf763 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 26 01:43:09 2013 +0200 Syntax error fixed Too much clojure latetly!! elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit d9109af2f6737cc4af0beb19bc597134ce9b416c Author: Jose Antonio Ortega Ruiz Date: Mon Aug 26 01:36:58 2013 +0200 Ensuring that comint-process-echoes is nil in REPL This variable makes comint wait for the underlying process to echo its input, something our schemes won't do. If anyone sets the variable globally for what can only be perverse reasons, we just would just hung. Not anymore. elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit 3a1dbf4e37f44e853cb649805a1f8777d0ba7501 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 25 07:12:07 2013 +0200 Let's make it *any* submodule So the new functions are named geiser-racket-*-submodules, and by default all submodule forms are hidden. Now that we have the helpers in geiser-edit, we could have a generic command in geiser-mode to change the visibility of form at point. NEWS | 4 ++-- elisp/geiser-edit.el | 6 +++++- elisp/geiser-racket.el | 50 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 39 insertions(+), 21 deletions(-) commit 79d3a9a2f332f71711734ee5dd1b7fb2c45ca797 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 25 06:22:05 2013 +0200 Racket: new commands to show and hide test submodules The new commands, being racket-specific, are called geiser-racket-{show,hide,toggle}-tests, and have no default binding in geiser-mode (since they don't have any meaning in Guile). The implementation is based on more generic functions in geiser-edit that allow hiding of any top-level form, given its name, so we will probably find new forms to hide in the future. Hiding is limited to top-level forms, which i think is fine for the only use case we have in mind right now. NEWS | 2 ++ elisp/geiser-edit.el | 28 ++++++++++++++++++++++++++++ elisp/geiser-racket.el | 21 +++++++++++++++++++++ 3 files changed, 51 insertions(+) commit ceb418aff619db01c5ed1201abff75df41a35102 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 12 00:31:12 2013 +0200 Newish emacsen don't have comint-last-prompt-overlay ... so we have to check if it's defined and, in its defect, use the new shiny comint-last-prompt. A bit of refactoring resulted. elisp/geiser-repl.el | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) commit 7fdc0f5aa049188043387608e92d4f3958c6cdeb Author: Jose Antonio Ortega Ruiz Date: Mon Aug 12 00:29:47 2013 +0200 A file not ending in newline, oh the horror Makefile.am | 1 + 1 file changed, 1 insertion(+) commit 04f49a44dd0ed8a78578f7b1253404a9a8734428 Author: Diogo F. S. Ramos Date: Mon Aug 5 14:39:51 2013 -0300 Add `dir' to EXTRA_DIST So the generated tarball from `make dist' will have `dir' inside. doc/Makefile.am | 2 ++ 1 file changed, 2 insertions(+) commit ecbd4c99c2bee884b7ac39d320342078b0a4f804 Author: Diogo F. S. Ramos Date: Mon Aug 5 11:43:41 2013 -0300 Add `dir' file to list the info manual If a user doesn't want to install geiser, it's possible to run it in place by loading `elisp/geiser.el' directly. It's also possible to read the info manual directly but it's inconvenient to not have it listed when hitting C-h i inside Emacs. To list such manual, it's necessary to tell info where to look for it. One way of doing it is adding the directory to the variable `Info-additional-directory-list'. But, for this to work, there's need to be a `dir' file listing the info manual. doc/dir | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 doc/dir commit 25a81dc10945622a0a52e54ea0b818aa1deae326 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 29 02:34:22 2013 +0200 Avoiding a segfault due to out of bounds stack size The parser in geiser-syntax is (tail, but elisp doesn't care) recursive, and we are setting max-lisp-eval-depth to some, ahem, heuristic value before starting a read. For long strings, such as that returned by the list of identifiers exported by the racket module, the heuristic was bad enough to produce a value making Emacs to blow away. This is just a palliative. The real solution is turn the recursion in geiser-syntax--read into an explicit iteration. elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 20a68166d0c05a18932bc784da5fe060fd3f32ae Author: Jose Antonio Ortega Ruiz Date: Tue Jul 2 21:15:42 2013 +0200 Real solution for the non-ascii-history problem We were using a history entry separator including \0 that wasn't writeable as an utf-8 file. Changing the separator to \n}{\n allows using UTF-8 characters in the REPL which are correctly read back. NEWS | 2 ++ elisp/geiser-repl.el | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) commit 82e47962fc16c037b8b7c6864dfee3a0eedaf183 Author: Jose Antonio Ortega Ruiz Date: Tue Jul 2 18:15:02 2013 +0200 Debug code removed scheme/racket/geiser/enter.rkt | 1 - 1 file changed, 1 deletion(-) commit 2a1e09d3d79e0daeee3f873487d7c0fce130a5fe Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 21:39:10 2013 +0200 A couple of byte-compilation warnings gone elisp/geiser-load.el.in | 1 + elisp/geiser-popup.el | 4 ++-- elisp/geiser-repl.el | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) commit 1399ac696c436d4e97c2c6dbfdebd9244c5dca94 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 20:41:43 2013 +0200 Using session instead of session.el for you bytecompilers elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b63597f22f8164da9dc7c5064e56411c877388c6 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 20:17:23 2013 +0200 Another not entirely satisfactory experiment with raw-text elisp/geiser-repl.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit c31f439314626cc314cab88117a950271c4df4b5 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 19:56:42 2013 +0200 Experiment setting history file coding system elisp/geiser-repl.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit bee2bd29087b21087caca10104d5251c7ed92800 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 15:41:27 2013 +0200 NEWS update NEWS | 4 ++++ configure.ac | 2 +- doc/macros.texi | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) commit d7d502df035d05b82bed3bf9d1ada2aafaaa0fcd Author: Jose Antonio Ortega Ruiz Date: Mon Jul 1 15:18:14 2013 +0200 Preventing session.el messing up with geiser-doc--history Session seems to be recovering the value of geiser-doc--history badly (see issue #7 for @achitu's discoveries), and since it is, in fact, not a good idea to save it anyway, we've added an eval-on-load deregistering the variable from session's list. elisp/geiser-doc.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) commit 096dfb84f6ca774c7f241b9ea446b510bbbccaf5 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 27 19:23:35 2013 +0200 Racket: not loading errortrace by default The new submodules and errortrace interact badly, for what i've seen. In particular, even with the submodule[+*] loading correctly, its namespace doesn't have all identifiers bound, and new ones seem to appear in the bindings lists (things like a.1 or b.2, when a and b are the actual identifiers defined inside the module). Since moreover someone mentioned in the devel ML that errortrace is in general terms buggy, i guess we can leave without it for the time being. scheme/racket/geiser/enter.rkt | 5 +---- scheme/racket/geiser/startup.rkt | 2 +- scheme/racket/geiser/user.rkt | 13 ++++++------- 3 files changed, 8 insertions(+), 12 deletions(-) commit bc3d5897f789de9afdf5d4f7aab48df8566bebf9 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 27 19:18:26 2013 +0200 White space, really elisp/geiser-guile.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 189b10e18b98d40b0f43cd07277a81cc09f10dae Author: Jose Antonio Ortega Ruiz Date: Thu Jun 20 21:55:46 2013 +0200 Another indentation rule: match-let-values elisp/geiser-racket.el | 1 + 1 file changed, 1 insertion(+) commit 05bded801b537d80ba52572d5a2c2fc1ad773447 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 15 19:06:58 2013 +0200 Missing require cl for case elisp/geiser-company.el | 2 ++ elisp/geiser-guile.el | 2 ++ elisp/geiser-racket.el | 2 ++ 3 files changed, 6 insertions(+) commit 0051c9ee4eefe5f8a9ab56d26f96f57b9f2870ef Author: Jose Antonio Ortega Ruiz Date: Tue Jun 11 15:51:05 2013 +0200 racket: ,cd accepting also non-quoted paths just because we can scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 5e1b969e20004f49f1174346a612269c56d0d785 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 11 15:29:25 2013 +0200 racket: struggling with submodules Submodule (re)loading is not without pecularities. In particular, module[*+] submodules are not visited the first time one enters its parent, but once you load them once, they're revisited every time we load the parent afterwards--racket's native enter! exhibits the same behaviour, so i'm guessing we'll have to live with that. There is however a glitch in that submodules can only be reloaded then by loading the parent, so we need to confirm that this is expected behaviour and, if it is, automating the parent's load when the submodule's is requested. On the other hand, entering a module[*+] is not working in Geiser yet, and it does in plain racket, so this one is our fault. Working on it. scheme/racket/geiser/enter.rkt | 56 +++++++++++++++++++++++------------------ scheme/racket/geiser/modules.rkt | 2 +- scheme/racket/geiser/user.rkt | 4 +-- 3 files changed, 35 insertions(+), 27 deletions(-) commit 7b1a1d046059eb2ce68ea02706a0e7494c39684f Author: Jose Antonio Ortega Ruiz Date: Mon Jun 10 00:06:55 2013 +0200 racket: new ,geiser-load command in REPL ... and used also internally for C-c C-k, although it doesn't yet work as well as i wanted when it comes to load modules. The reason is probably in geiser/enter, where we don't record modification times per submodule but per path, which is not correct in the presence of submodules. elisp/geiser-racket.el | 68 ++++++++++++++++++++++---------------------- elisp/geiser-syntax.el | 3 ++ scheme/racket/geiser/eval.rkt | 8 +++--- scheme/racket/geiser/user.rkt | 34 +++++++++++++++------- 4 files changed, 65 insertions(+), 48 deletions(-) commit bba166c3ccb136fa8321ad9acc9cfd48a5fed357 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 10 00:04:30 2013 +0200 Nits scheme/racket/geiser/enter.rkt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) commit e742a202a8cdc1cb4712425e69d9335098fb1693 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 9 00:48:42 2013 +0200 racket: C-u C-c C-z on a submodule enters it scheme/racket/geiser/user.rkt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) commit f7d7ec626066ca067db0e3bb9cc42f45ab1c5727 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 9 00:48:13 2013 +0200 racket: module* and module+ denote submodules too Recognizing those forms in the elisp module getter. elisp/geiser-racket.el | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) commit 2c72e754cc0f988056c0cae2c7a35fedccf02c2b Author: Jose Antonio Ortega Ruiz Date: Sun Jun 9 00:47:28 2013 +0200 racket: handling correctly submodules in load handler during ,enter That is, complying to the submodule loading protocol (cf. racket's own enter!). scheme/racket/geiser/enter.rkt | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) commit c548baba9c4c708f697dfde9c33c2fb92f707e93 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 9 00:28:47 2013 +0200 racket: indentation for module* elisp/geiser-racket.el | 1 + 1 file changed, 1 insertion(+) commit 2dfa425356fabe2289598212b32359dc41dfb64c Author: Jose Antonio Ortega Ruiz Date: Sat Jun 8 23:15:15 2013 +0200 racket: ,gcd -> ,pwd And we display it (the current path, settable via ,cd) as a string. This was, i'm sure, a secret command nobody is using! scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 1551885d929463723748b81e9bfab07bde0d1f47 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 8 16:01:01 2013 +0200 racket: ,enter submodules It is now possible to ,enter racket submodules. This is only the first part of the story, because evalations should take place in the submodule, not in its top level module, as it happens now. scheme/racket/geiser/modules.rkt | 37 +++++++++++++++++++++---------------- scheme/racket/geiser/user.rkt | 18 ++++++++++++------ 2 files changed, 33 insertions(+), 22 deletions(-) commit bb38fa9c5cae5095a629c6cbb4ea570d47adeb62 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 6 23:48:28 2013 +0200 For crazy guys that use (define/match [foo bar] ...) Racket is happy with that, so who are we to disagree? elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 9d170c4831a2488ba0fbdc57dddab3143f44357e Author: Jose Antonio Ortega Ruiz Date: Thu Jun 6 23:41:46 2013 +0200 Racket: correct font-lock for define/match, again We weren't considering the obvious: (define/match (foo bar) ...) NEWS | 1 + elisp/geiser-racket.el | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) commit 54ca5d09076ea1ad29076075abe30a32594e8c5f Author: Jose Antonio Ortega Ruiz Date: Thu Jun 6 03:55:42 2013 +0200 Racket: correct font lock for define/match We could probably generalize to more function definition forms, but this is a start. elisp/geiser-racket.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) commit 06cb8552677d5b315c2b75f84944265f7feb570d Author: Jose Antonio Ortega Ruiz Date: Tue Jun 4 14:59:24 2013 +0200 Ludovic made it also to AUTHORS and NEWS AUTHORS | 1 + NEWS | 5 +++++ 2 files changed, 6 insertions(+) commit 99e1cb68577896b2d1afcc9b6ab52e5c6a3a523f Author: Ludovic Courtès Date: Tue Jun 4 14:42:57 2013 +0200 Guile: Fix subr argument name retrieval for Guile >= 2.0.9. scheme/guile/geiser/doc.scm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 7613969054120384af99e9d6115cd4667b65c553 Author: Jose Antonio Ortega Ruiz Date: Tue May 21 18:54:58 2013 +0200 Authors and news updated to include Darren AUTHORS | 1 + NEWS | 2 ++ 2 files changed, 3 insertions(+) commit 20e0501f9cc82c6938e465303a29b69ef1636628 Author: Darren Hoo Date: Tue May 21 15:01:11 2013 +0800 yank input if point is over history input elisp/geiser-repl.el | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) commit 4d8158a0ea1e3019935149431ff93385e72af576 Author: Jose Antonio Ortega Ruiz Date: Tue May 14 01:36:38 2013 +0200 Nits in geiser-racket.sh bin/geiser-racket.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 508f06277de0405e48ddc1e62dde214517b5b549 Author: Jose Antonio Ortega Ruiz Date: Tue May 14 01:36:16 2013 +0200 Documentation updates A nit about the new commands docs, and thanks to Nick Parker. AUTHORS | 1 + NEWS | 7 +++++++ doc/parens.texi | 7 +++---- 3 files changed, 11 insertions(+), 4 deletions(-) commit 48b70f4bcee81de0d2a61eb2310ed08ab4e306f3 Author: Nick Parker Date: Mon May 13 13:36:34 2013 -0500 Add geiser-eval-buffer & geiser-eval-buffer-and-go These functions are similar to geiser-eval-region and geiser-eval-region-and-go, however they allow the user to operate on the entire buffer, not requiring the user to narrow to a specific region. This also differs slightly from geiser-compile-current-buffer as geiser-eval-buffer does not require the contents of the buffer to be saved prior to being sent to the REPL. Documentaion has also been updated to include references to the new methods and their keybindings. README | 2 ++ doc/cheat.texi | 6 ++++++ doc/parens.texi | 4 ++++ elisp/geiser-mode.el | 25 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+) commit 168376ebcb164bca88cf487b07361ae8fe0a6a3e Author: Aleix Conchillo Flaque Date: Wed May 8 22:22:24 2013 -0700 guile: lambda* indentation elisp/geiser-guile.el | 1 + 1 file changed, 1 insertion(+) commit bf1134c65c166eea537bc73797ef6f48cb9b4abe Author: Jose Antonio Ortega Ruiz Date: Sat May 4 15:07:37 2013 +0200 Release date for the web doc/macros.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit c5097cf3a8dc60cab206d2af08223be9793116bf Author: Jose Antonio Ortega Ruiz Date: Fri May 3 20:15:00 2013 +0200 NEWS for 0.4 NEWS | 4 ++-- doc/cheat.texi | 3 +++ doc/geiser.texi | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) commit 95f0b314ea50737c2b0631932328233f130d8373 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 28 15:16:57 2013 +0200 Thanks where thanks are due THANKS | 7 +++++++ doc/thanks.texi | 6 ++++++ 2 files changed, 13 insertions(+) commit 87faab8c881210d0d782427f504c2ab7611c82d8 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 28 15:07:55 2013 +0200 Issue tracker links pointing to Github's Almost all contributions have come this way, and it's a hassle having two of them. doc/thanks.texi | 4 ++-- doc/web.texi | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit 69761d95c7142551efae87ebae1be8afcbe9d176 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 28 15:04:49 2013 +0200 Mailto link for the witty geiser-users address ... since i've got reports that it's sometimes annoying not to be able to directly click and post. doc/thanks.texi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit bfa5d426c48a075d1386f4feb8d6833ba6ba1670 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 21 02:45:28 2013 +0200 Fix for Racket compilation error jumping in REPL The backtraces now display some leading whitespace, which the default compilation-mode regexps was making part of the file name. elisp/geiser-racket.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) commit 8c9313c3976cd8962edc2b5ee95b1168a3e21814 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 21 02:17:58 2013 +0200 Racket: fixing error backtrace cleansing i.e., removing again references to geiser's innards elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 8b16e095fd38bc3ca0c51b8b97b449f6a8d80e1b Author: Jose Antonio Ortega Ruiz Date: Wed Apr 17 18:14:31 2013 +0200 Racket: fix for jump to manual for symbols not in the namespace We had broken using the hint that `help` offers during our recent adventures... elisp/geiser-racket.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 496efc48adf247cd5d17beb436f71f38a89f9f1d Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 16:09:00 2013 +0200 Remainin reference to company's screencast gone. Fixes #3 for real README | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) commit 311db249e9238358445e36cf8d4c4aff3d363945 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 16:05:22 2013 +0200 Company mode screencast seems gone for good And Dmitry is now maintaining it. Links updated, issue #3 fixed. doc/install.texi | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) commit cd2c241c71a13aedf700d98b5cb2552c29d8afee Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 12:53:53 2013 +0200 NEWS entry since Diogo confirmed things work again NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 8c6eb94980cac77f22d8a972b08a0a2ed4d44b77 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 11:14:13 2013 +0200 Racket: correct detection of manual lookup failures Still a tad messy, because we are always forcing a retort-syntax error and checking its ouput, but good enough for now. elisp/geiser-racket.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) commit b32cc5ea37430c5d06ba2964ccdc430ce0faad80 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 11:13:02 2013 +0200 Racket: ensuring the first C-c C-d C-i works ... by the obvious device of waiting for the thread building the index to finish. scheme/racket/geiser/autodoc.rkt | 12 ++++++++++++ scheme/racket/geiser/user.rkt | 4 ---- 2 files changed, 12 insertions(+), 4 deletions(-) commit 82f909d80a55f0dcf8639b094351f5e61f3449e6 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 10:43:07 2013 +0200 Racket: fixing help when REPL is in a module The evaluation of the help form must happen in a good enough namespace. scheme/racket/geiser/autodoc.rkt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit 5aec661ebb415b474b5bc01a8a295fc7c2639f8a Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 04:18:19 2013 +0200 Racket: pre-loading help also in remote REPLs scheme/racket/geiser/user.rkt | 1 + 1 file changed, 1 insertion(+) commit c00f24907cf87589f4b28885507443d419385502 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 15 04:08:08 2013 +0200 Racket: better help commands For some reason that i don't fully understand, evaluating a function in the racket/base namespace first thing after loading errortrace breaks the help macro (!). This patches provides a workaround by actually invoking help first thing when Geiser starts, with alibi that it serves to preload the help index (in a separate thread). While i was at it, i improved the message printed in the minibuffer when no help is found. elisp/geiser-racket.el | 20 ++++++++++---------- scheme/racket/geiser/autodoc.rkt | 5 ++--- scheme/racket/geiser/startup.rkt | 4 +--- scheme/racket/geiser/user.rkt | 13 +++++++++++-- 4 files changed, 24 insertions(+), 18 deletions(-) commit 82165389e02b4ff29bade2a2b34903142e3bc73a Author: Jose Antonio Ortega Ruiz Date: Sun Apr 14 03:23:00 2013 +0200 More good NEWS NEWS | 2 ++ 1 file changed, 2 insertions(+) commit 8966cbbdc5615051bf0def94d7b6f18e4b295de3 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 14 03:15:52 2013 +0200 Disabling company calls while the REPL is working elisp/geiser-company.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) commit 3b5397c8dad34f9dfe83c2c44eeece0de9097df3 Author: Jose Antonio Ortega Ruiz Date: Sat Apr 13 05:22:20 2013 +0200 A better solution to the funky filename problem So, the problem was that our regexp for a Racket prompt didn't take into account that filenames could contain white spaces: "@[^ ]*> ". A simple solution was accepting them: "@[^>]+> " won't work because '>' is also a valid character in filenames, so we went for "@.*> ". The drawback is that finding the beginning of the prompt (e.g. in C-a) fails when you're writing things like: racket@foo bar.rkt> (> 2 3) because here comint believes that the prompt is "racket@foo bar.rkt> (> " And that could have side-effects elsewhere. So what i've done is simply changing the way white-space is (not) printed in the prompt, substituting it by underscores. That way, whe can go back to the initial regexp, comint doesn't get confused, and users can easily infer that "@foo_bar.rkt>" is actually referring to their "foo bar.rkt" file. elisp/geiser-racket.el | 2 +- scheme/racket/geiser/user.rkt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit d494b97c34386470fa9b7ee7ddcc63c41b8c51ff Author: Jose Antonio Ortega Ruiz Date: Sat Apr 13 00:43:45 2013 +0200 Another take at the fix (files with >, bleh) elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 2124e366e3590e6d01931a9eca098e4a0c3d85ed Author: Jose Antonio Ortega Ruiz Date: Sat Apr 13 00:22:48 2013 +0200 Good NEWS NEWS | 2 ++ 1 file changed, 2 insertions(+) commit d59b4b1ffe2892d918ad9354c7a0b28f5f30de5f Author: Jose Antonio Ortega Ruiz Date: Sat Apr 13 00:03:54 2013 +0200 Racket: accepting spaces within comint's prompt Since spaces are allowed inside filenames after all. elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 65bc295b35beac42e410ae78a3077ce28f1e49a9 Author: Jose Antonio Ortega Ruiz Date: Fri Apr 12 01:05:34 2013 +0200 A bit of documentation for the previous patches AUTHORS | 9 +++++---- NEWS | 2 ++ doc/parens.texi | 4 +++- elisp/geiser-mode.el | 9 +++++++++ 4 files changed, 19 insertions(+), 5 deletions(-) commit 7a666d1e2da690ab45a2f40d388e47df711e4868 Author: Jose Antonio Ortega Ruiz Date: Fri Apr 12 00:57:23 2013 +0200 Simplifications to previous patch elisp/geiser-debug.el | 9 +++++---- elisp/geiser-eval.el | 22 +++++++--------------- elisp/geiser-mode.el | 27 ++++++++++++--------------- 3 files changed, 24 insertions(+), 34 deletions(-) commit 2ebc1225b929d2a3c3b25fbd7596adb4d49915f0 Author: Diogo F. S. Ramos Date: Thu Apr 11 18:56:30 2013 -0300 Evaluate last expression to buffer with a prefix Use a prefix before pressing C-x C-e to print the result of evaluating the expression before mark to the current buffer. elisp/geiser-debug.el | 6 +++--- elisp/geiser-eval.el | 10 ++++++++++ elisp/geiser-mode.el | 24 +++++++++++++++++------- 3 files changed, 30 insertions(+), 10 deletions(-) commit 246175eadf22a2ab7121be68d37d01f320ddb44a Author: Jose Antonio Ortega Ruiz Date: Fri Apr 12 00:04:26 2013 +0200 Hide auto-started REPL I'm not convinced that this is the right thing, and the effect is a bit ugly (we use save-window-excursion), but maybe this is the correct thing to do for users that want auto-start. elisp/geiser-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 80028aa5e49cf897e371bf030eea399d14771e24 Author: Jose Antonio Ortega Ruiz Date: Thu Apr 11 07:16:37 2013 +0200 Documentation for the latest changes NEWS | 5 +++++ doc/parens.texi | 6 ++++++ doc/repl.texi | 12 ++++++++++++ 3 files changed, 23 insertions(+) commit 96f8693803a4f49770f3bd7a1b3dbad778522987 Author: Jose Antonio Ortega Ruiz Date: Thu Apr 11 07:16:17 2013 +0200 New flag to automatically start REPLs when geiser-mode is activated When no live REPL is found, of course. The flag's imaginatively called geiser-mode-start-repl-p. elisp/geiser-mode.el | 12 +++++++++++- elisp/geiser-repl.el | 14 +++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) commit d32d4e1a4480f236089fb27ce5f5c4968f1119e7 Author: Jose Antonio Ortega Ruiz Date: Wed Apr 10 16:06:47 2013 +0200 Fix for evaluations returning no result Such as (values), which produce a retort of the form ((result) ...), which has nothing wrong in it! Thanks to Diogo. elisp/geiser-connection.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit c0c3723b1b5ee54e977a25a2f8a409a8071f1976 Author: Jose Antonio Ortega Ruiz Date: Tue Apr 9 20:32:09 2013 +0200 New customizable geiser-repl-query-on-kill-p In case you don't care about killing live REPLs... elisp/geiser-repl.el | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) commit 673c6c9fa481c3b50921f2d94afa3c5a73b1920e Author: Jose Antonio Ortega Ruiz Date: Tue Apr 2 18:45:20 2013 +0200 More Racket for/* forms indentation from Diogo elisp/geiser-racket.el | 6 ++++++ 1 file changed, 6 insertions(+) commit c85ba34b47b25614eb58219d5fc97815df7f7301 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 1 19:24:21 2013 +0100 Using implementation-specific keywords also in REPL And, while we're at it, honour the new case-sentive flag, as suggested by Diogo. elisp/geiser-repl.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 00912584fa4871acee500a094793a0cbef5de211 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 1 04:33:21 2013 +0100 Indentation rule for match/values (Diogo F.S. Ramos) elisp/geiser-racket.el | 1 + 1 file changed, 1 insertion(+) commit fb052f96692b233f21e989df1dd9c8b966d8c030 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 1 04:27:02 2013 +0100 NEWS entry for the above, er, below NEWS | 3 +++ 1 file changed, 3 insertions(+) commit 4d06d7e13c2b1873b2de2c85333faa6b3d4b93dc Author: Jose Antonio Ortega Ruiz Date: Fri Mar 1 04:24:21 2013 +0100 Configurable keyword case sensitivity By default, keywords are now not fontified in Scheme buffers unless they have the correct (lower) case. This behaviour can be altered by new, per-implementation customization variables. Thanks to Diogo F. S. Ramos for pointing this out. elisp/geiser-guile.el | 16 ++++++++++++---- elisp/geiser-impl.el | 5 +++-- elisp/geiser-racket.el | 6 ++++++ elisp/geiser-syntax.el | 11 ++++++++--- 4 files changed, 29 insertions(+), 9 deletions(-) commit 8569220b3aa3312e9de80c95a28a36e7adb750c4 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 23 00:24:35 2013 +0100 Stop spreading misinformation about Racket's help browser Thanks to Vitalie Spinu doc/parens.texi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 0e76e0d96b0ba2f5aa79aa2485e87daee675256c Author: Jose Antonio Ortega Ruiz Date: Wed Feb 20 09:16:25 2013 +0100 Indentation for match-let elisp/geiser-racket.el | 1 + 1 file changed, 1 insertion(+) commit 01cfa0befac00b068f62744e6cdf90d7b2472230 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 9 23:51:09 2013 +0100 Indentation for Racket's struct Thanks to Diogo F. S. Ramos. elisp/geiser-racket.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 2e581e278a1864be9143e841ec1b5c403dce0c86 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 7 03:20:43 2013 +0100 Accepting ~ in geiser-add-to-load-path elisp/geiser-compile.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 7916065e7156db3f128c1e5fd27783b4a18baa2f Author: Jose Antonio Ortega Ruiz Date: Sun Feb 3 02:44:19 2013 +0100 Little cleanups, and C-u variant for the lambda thing elisp/geiser-edit.el | 8 -------- elisp/geiser-mode.el | 10 +++++++++- 2 files changed, 9 insertions(+), 9 deletions(-) commit 5e63968f431a40c0ea8dc7391ee95b869d9d9bff Author: Jose Antonio Ortega Ruiz Date: Sun Feb 3 01:24:38 2013 +0100 NEWS and version housekeeping NEWS | 11 +++++++++++ configure.ac | 2 +- doc/macros.texi | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) commit 5c433339e648048e3efec422a2a974fe8e83134f Author: Jose Antonio Ortega Ruiz Date: Sun Feb 3 01:05:24 2013 +0100 Thanks to Ray AUTHORS | 3 +++ 1 file changed, 3 insertions(+) commit f2ca54c25fc6e8cc4a90ddbe2513e774b1b2b2f3 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 3 01:02:26 2013 +0100 More robust lambda and keybinding to C-c \ Since C-\ is a standard Emacs binding, and people know how to change it anyway. I've also put the command in the menu for Geiser mode, for discoverability. A pleasant surprise: greek lambdas are understood by both Racket and Guile. elisp/geiser-edit.el | 4 ++-- elisp/geiser-mode.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 43dd4894285c2b2aff6bcc17ac9b2bf8f3868702 Author: Ray Racine Date: Sat Feb 2 13:05:44 2013 -0500 Insert Greek letter lambda. elisp/geiser-edit.el | 8 ++++++++ elisp/geiser-mode.el | 1 + 2 files changed, 9 insertions(+) commit 9cdd48af25b299c32adb7dd1ddd025a5bc6fd1cf Author: Jose Antonio Ortega Ruiz Date: Tue Jan 22 17:21:00 2013 +0100 Using comint-dynamic-complete-filename .. which seems to be available also in emacs 23.2 (although reports as to whether it works are mixed), and has better behaviour anyways. elisp/geiser-completion.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 9ded8b3b3b3cb0739c4650f55bb2190f16786bea Author: Jose Antonio Ortega Ruiz Date: Sat Jan 19 18:54:07 2013 +0100 Download links fixed doc/install.texi | 7 +++---- doc/macros.texi | 8 +++----- 2 files changed, 6 insertions(+), 9 deletions(-) commit 597d3ce0bef5185d9e969fed733226db6ee796bb Author: Jose Antonio Ortega Ruiz Date: Sat Jan 19 18:53:35 2013 +0100 ELPA-specific README Makefile.am | 4 ++-- README.elpa | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 README.elpa commit 79b938746d55e53ba73f186d746c3a0410256782 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 19 15:26:11 2013 +0100 NEWS and AUTHORS updated AUTHORS | 1 + NEWS | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) commit 3eaa8bc8522ffd341d9036fc3e4be555dc9687c6 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 19 15:10:00 2013 +0100 Preparations for 0.3 NEWS | 14 +++++++++++--- configure.ac | 4 ++-- doc/macros.texi | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) commit 7c2ca2bb6e59e312019613db85fd86e7918ee1dc Author: Jose Antonio Ortega Ruiz Date: Fri Dec 14 16:25:18 2012 +0100 Racket: make sure stderr is flushed in REPL Thanks to Haiwei Zhou for catching this one! scheme/racket/geiser/user.rkt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit bfcdc1c92dcf25dfd06cdc03fbd685c7daf40bbe Author: Jose Antonio Ortega Ruiz Date: Fri Dec 14 00:18:46 2012 +0100 Racket: indentation for `local'. Hat tip Diogo F. S. Ramos. elisp/geiser-racket.el | 1 + 1 file changed, 1 insertion(+) commit 01bd372829e5309f24b3d14ca9a879ad1fd6f6c6 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 10 23:26:31 2012 +0100 Fix: more encompassing lookup for images in scheme output We were not taking into account windows paths, with their backslashes and colons. elisp/geiser-image.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit f6e0ac85012c2e46dff12e9ec0181c02b6074b8a Author: Jose Antonio Ortega Ruiz Date: Sun Nov 11 16:58:07 2012 +0100 New command geiser-repl-clear-buffer Just renamed geiser-repl--clear-buffer (we don't use -- when users can call the command with M-x normally) and added documentation. NEWS | 3 ++- README | 1 + doc/cheat.texi | 3 +++ elisp/geiser-repl.el | 24 ++++++++++-------------- 4 files changed, 16 insertions(+), 15 deletions(-) commit a814cf43fa33f66cb2fca512084d7ac2b63ae62a Author: Jonas Rodrigues Date: Fri Nov 9 18:20:32 2012 -0200 New function 'geiser-repl--clear-buffer' elisp/geiser-repl.el | 14 ++++++++++++++ 1 file changed, 14 insertions(+) commit f5144a27494a1e83d658d400289ba104b050ffd3 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 28 01:38:17 2012 +0200 Racket: fix for module evaluation/entering Our module loader is receiving load requests for module names represented as lists that are not exactly a submodule, in the sense that the path does not represent an actual file. This phenomenon happens for instance when specifying a reader in a #lang tag. E.g. #lang at-exp racket will cause the loader to be called with module name '(main reader) and path /at-exp/main.rkt, where main.rkt does not exist. Afterwards, we see a call to load at-exp/lang/reader/rkt, with name reader, which is the real code. So, for now, i'm skipping all load requests with a list name, forwarding them to racket's default loader. scheme/racket/geiser/enter.rkt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) commit 8bf3f70f6aba159461612be8577bd4193ee7c6e6 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 27 22:58:38 2012 +0200 Filename completion also in scheme buffers By means of a new entry in completion-at-point-functions that uses the handy comint-filename-completion. NEWS | 7 ++++--- elisp/geiser-completion.el | 11 +++++++++-- elisp/geiser-repl.el | 2 -- 3 files changed, 13 insertions(+), 7 deletions(-) commit de6fc09551730fe87f7f3d6f532bafd189c97236 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 24 05:17:34 2012 +0200 Completing file names at the REPL, but only in string contexts NEWS | 1 + elisp/geiser-repl.el | 4 +++- elisp/geiser-syntax.el | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) commit 5b77d598ee04f324cbaf4eaacfe71e534bb2ed34 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 24 05:04:46 2012 +0200 Completing file names at the REPL When no other completion is available, that is. elisp/geiser-repl.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 08b4499a0c440279257b38d49003ea5a6c848a45 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 24 04:17:19 2012 +0200 Little clean-ups to the indentation rules Splitting better the specially indented forms between our two implementations, so that users of a single one don't get weird indentations for froms without a special meaning in their scheme. Ideally, we should make these indentation rules buffer-local, so that when a user is in a, say, Guile buffer, module+ has no special indentation (as is the case now if that user also has activated support for Racket). NEWS | 3 ++ elisp/geiser-guile.el | 14 +++++++++- elisp/geiser-racket.el | 77 +++++++++++++++++++++++++++++++++++---------------- elisp/geiser-syntax.el | 36 ------------------------ 4 files changed, 69 insertions(+), 61 deletions(-) commit fd71a43c2be7f86e7b68d2badca6030103f54f05 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 24 03:51:33 2012 +0200 Racket: indentation for module+ forms elisp/geiser-racket.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 5f357d12363d9b214bab82ba12447d657733a289 Author: Jose Antonio Ortega Ruiz Date: Tue Oct 23 01:09:27 2012 +0200 New custom var `geiser-repl-save-debugging-history-p' This variable controls whether REPL command history should contain inputs during the debugger sessions (for schemes with such a thing, that is, for Guile). elisp/geiser-repl.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) commit 5e1a4995ee1211f2a57d4fce4101b81be13d87db Author: Jose Antonio Ortega Ruiz Date: Sat Oct 13 04:14:25 2012 +0200 Manual lookup shortcut (C-c C-d i) also in REPL buffers doc/cheat.texi | 3 +++ doc/repl.texi | 4 +++- elisp/geiser-repl.el | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) commit b0684896df77372e8be1f4bcf6d6b7a1cb142b47 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 04:19:50 2012 +0200 Finishing removal of the "foo ends here" footers I must admit this is yet another excuse to check geiserbot over at freenode. scheme/guile/geiser/completion.scm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) commit d00c933074acc68774373e90301807e16e650c17 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 04:17:35 2012 +0200 Whitespace elisp/geiser-autodoc.el | 3 +-- elisp/geiser-base.el | 3 +-- elisp/geiser-company.el | 3 +-- elisp/geiser-compile.el | 3 +-- elisp/geiser-custom.el | 3 +-- elisp/geiser-debug.el | 1 - elisp/geiser-doc.el | 3 +-- elisp/geiser-edit.el | 1 - elisp/geiser-eval.el | 3 +-- elisp/geiser-impl.el | 4 +--- elisp/geiser-log.el | 3 +-- elisp/geiser-menu.el | 4 +--- elisp/geiser-mode.el | 3 +-- elisp/geiser-popup.el | 3 +-- elisp/geiser-reload.el | 1 - elisp/geiser-syntax.el | 1 - elisp/geiser-table.el | 1 - elisp/geiser-xref.el | 3 +-- 18 files changed, 13 insertions(+), 33 deletions(-) commit cbcfbe26411d0ffecd4e9627428d29113c398d7a Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 04:12:00 2012 +0200 Dummy entry in NEWS for 0.2.3 NEWS | 3 +++ 1 file changed, 3 insertions(+) commit 3092e3a32ed0fc77949f048ea0a4da2c8c26416f Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 04:01:35 2012 +0200 Please, bear with me commit 055ac24eab065aa0b314be89815ba0bbf9525782 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 03:57:32 2012 +0200 And this is another empty commit to check geiserbot commit 299daf0dd388b568de34a11d55ede98f540bcc8d Author: Jose Antonio Ortega Ruiz Date: Thu Oct 11 03:44:19 2012 +0200 This is an empty commit to check geiserbot commit 0e802791514eeb3e6185259939829ab5e7df5d96 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 30 05:21:50 2012 +0200 Version bump -- next cycle begins! configure.ac | 2 +- doc/macros.texi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit aba6733e848c47cb4f8e5d749add65be51d5d784 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 30 04:42:27 2012 +0200 Documentation updates INSTALL | 339 +++++++------------------------------------------------- NEWS | 5 +- README | 50 ++------- THANKS | 3 + doc/geiser.texi | 3 +- doc/install.texi | 72 ++++++++++-- doc/macros.texi | 4 +- doc/parens.texi | 12 +- doc/repl.texi | 2 +- doc/thanks.texi | 3 + 10 files changed, 136 insertions(+), 357 deletions(-) commit 5ef6713714c875fb6a51e5504313c0f8963687be Author: Jose Antonio Ortega Ruiz Date: Sun Sep 30 01:49:53 2012 +0200 New make target, elpa, to create ELPA target A bunch of shellish ops, but seems to be working fine. Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++ elisp/geiser.el | 18 ------------------ 2 files changed, 39 insertions(+), 18 deletions(-) commit a4dd6a93ffb8475df98baf8d3239cc404afd1460 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 30 01:48:31 2012 +0200 Compilation warning elisp/geiser-table.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit b18bd1f1bdfbdd92d3167884676c59b4c27bde92 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 29 23:55:07 2012 +0200 Autoload cookies in geiser.el Useless there right now, but Emacs package engine is going to use them. elisp/geiser-racket.el | 1 + elisp/geiser.el | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) commit 566442e67e7e85a5543515278d79e2a464598e0e Author: Jose Antonio Ortega Ruiz Date: Sat Sep 15 22:13:54 2012 +0200 Version bump Setting next version's value in the Git repos, so that people can have both unstable and stable versions in their systems. NEWS | 2 ++ configure.ac | 2 +- doc/macros.texi | 7 ++++--- doc/web.texi | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) commit 2d8058f7f834106230e0aef637b05b0a8b83882b Author: Jose Antonio Ortega Ruiz Date: Sat Sep 15 21:52:28 2012 +0200 New download link doc/install.texi | 2 +- doc/macros.texi | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) commit be72bafd337df18ecfbc64fa01f5a1704186c985 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 15 18:26:30 2012 +0200 racket: correctly jump to symbols defined in .ss modules Racket is returning by default their canonical "rkt" name, which sometimes is not what's in the filesystem. NEWS | 2 ++ scheme/racket/geiser/locations.rkt | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) commit d23e836753472c33a5339446160dc3891ac0c2bd Author: Jose Antonio Ortega Ruiz Date: Sat Sep 15 17:50:42 2012 +0200 News and version tags for 0.2.1 NEWS | 14 ++++++++++++++ configure.ac | 2 +- doc/macros.texi | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) commit 144025a8c111ca4082e0b039bf459dc5225a2a54 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 15 16:39:21 2012 +0200 racket: fix re-loading of modules with submodules (e.g. plai-typed) Resolved module path can now be, besides symbols, a list representing a submodule. When deciding whether what we are loading in enter's current loader is a module or not, we have now to take that bit into account. scheme/racket/geiser/enter.rkt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) commit 5e1e9373efcd937635eea68c94d52aa00f4c565d Author: Jose Antonio Ortega Ruiz Date: Sat Sep 8 20:05:15 2012 +0200 racket: autodoc for PLAI's define-type scheme/racket/geiser/autodoc.rkt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 977335378247e8c7df0594fc300cb82c4ce6bbc7 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 8 19:24:10 2012 +0200 Racket: new option to specify network interface for REPL server In geiser-racket.sh, there's the new option -n, which uses a new hostname argument accepted by geiser/user's start-geiser function. bin/geiser-racket.sh | 4 +++- doc/repl.texi | 11 ++++++----- scheme/racket/geiser/user.rkt | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) commit 97f2fb5b47aaeec00cdcd1c6082e95c907eb3f62 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 23:12:20 2012 +0200 Dates updates NEWS | 2 +- doc/web.texi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit a0576387d7eaf3ef9d10d77630544b733fc51b76 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 23:06:03 2012 +0200 Image support documented in user manual doc/geiser.texi | 3 ++- doc/img/repl-images.png | Bin 0 -> 150007 bytes doc/intro.texi | 3 +++ doc/parens.texi | 9 ++++++++- doc/repl.texi | 33 ++++++++++++++++++++++++++++++--- 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 doc/img/repl-images.png commit 3439cf7784cd6f1e18e5c71797f904575dac0271 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 22:34:33 2012 +0200 geiser-system-image-viewer -> geiser-image-viewer elisp/geiser-image.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit a1f7d888a9d2139b9eb9e2b146ffb682107bf7f2 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 21:55:04 2012 +0200 Credits and boilerplate for the a new version AUTHORS | 7 +++++-- README | 4 +++- THANKS | 3 +++ configure.ac | 4 ++-- doc/macros.texi | 4 ++-- doc/thanks.texi | 3 +++ 6 files changed, 18 insertions(+), 7 deletions(-) commit 18d00a80b4f3d7e3a38368bc124b252ddb1cd63c Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 21:39:04 2012 +0200 Including the new images.rkt in the distribution By listing it in the corresponding Makefile.am file. I wonder how useful maintaining all this autofoo stuff really is: creating an ELPA package could be more handy for people not using the git repo directly, and much easier to maintain. scheme/Makefile.am | 1 + 1 file changed, 1 insertion(+) commit 1854a6b537d2e462d15b90af9e14719cbaeb8829 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 21:35:18 2012 +0200 NEWS update ... in preparation for 0.2. NEWS | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) commit cfed599a48b36b412a08b08df96fee230b58c06b Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 20:56:22 2012 +0200 Elisp: insert instead of put images Images rendered via put-image won't be deleted by erase-buffer (they're overlays), while those inserted by insert-image (text properties) will. elisp/geiser-image.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 8f2e4ba17b704965f3a35d1d0a312dec31800862 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 20:19:36 2012 +0200 racket: displaying images also during evaluations elisp/geiser-debug.el | 36 +++++++++++++++++++++++++-------- elisp/geiser-image.el | 46 +++++++++++++++++++++++------------------- elisp/geiser-repl.el | 4 +++- scheme/racket/geiser/eval.rkt | 8 ++++---- scheme/racket/geiser/images.rkt | 46 ++++++++++++++++++++++++++++++++++++++++++ scheme/racket/geiser/user.rkt | 35 +++----------------------------- 6 files changed, 109 insertions(+), 66 deletions(-) create mode 100644 scheme/racket/geiser/images.rkt commit b05120e5872382528c73416046d4e19cdb1bc88f Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 14:11:30 2012 +0200 Racket: fix for enter! scheme/racket/geiser/enter.rkt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 69d94011a0261392a7772980d2b95e1469b2e876 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 03:29:15 2012 +0200 Credits in header elisp/geiser-image.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 18c0a96cbf293e5b702316476634936766a5fd11 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 03:26:28 2012 +0200 Image support: buttons and auto-display in the REPL When geiser-repl-inline-images-p is false (or we're in a terminal), the inserted text replacement is a button that calls the external viewer on click. There's also a parameter controlling whether the viewer should be invoked automatically upon insertion. elisp/geiser-image.el | 32 +++++++++++++++++++++++--------- elisp/geiser-repl.el | 21 +++++++++++++++------ 2 files changed, 38 insertions(+), 15 deletions(-) commit 67a2d3eac579b10e2f526f1282b459fcf8f12804 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 2 02:34:47 2012 +0200 Image display functionality refactored to its own module elisp/Makefile.am | 2 +- elisp/geiser-image.el | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-racket.el | 13 ++----- elisp/geiser-reload.el | 3 +- elisp/geiser-repl.el | 69 +--------------------------------- elisp/geiser.el | 3 +- 6 files changed, 113 insertions(+), 79 deletions(-) create mode 100644 elisp/geiser-image.el commit de61b6f6580be0daad3e7aa97acd1534c30fbedf Author: Jose Antonio Ortega Ruiz Date: Sat Sep 1 05:42:46 2012 +0200 Little cleanups scheme/racket/geiser/enter.rkt | 112 ++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 54 deletions(-) commit bc21d274994eb40366d1c372fd1185483815b7ef Merge: 6c5ceb7 52b7dbc Author: Jose Antonio Ortega Ruiz Date: Sat Aug 25 06:29:03 2012 +0200 Merge branch 'master' of git.sv.gnu.org:/srv/git/geiser Conflicts: elisp/geiser-racket.el commit 6c5ceb7ce8f194a7d0e542a3bae268e0506fdd71 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 25 06:10:05 2012 +0200 racket: reading into elisp-land the cache dir as needed When no cache dir is set in the emacs customization, we ask Racket for the one that it's using by default. elisp/geiser-racket.el | 9 +++++---- scheme/racket/geiser/user.rkt | 8 +++++--- 2 files changed, 10 insertions(+), 7 deletions(-) commit 52b7dbc9555f338dd529542e141f9938047db247 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 25 06:10:05 2012 +0200 Racket: reading into elisp-land the cache dir as needed When no cache dir is set in the emacs customization, we ask Racket for the one that it's using by default. elisp/geiser-racket.el | 9 +++++---- scheme/racket/geiser/user.rkt | 8 +++++--- 2 files changed, 10 insertions(+), 7 deletions(-) commit 9b31ffba524337003c00a62997a27a62a270100e Author: Jose Antonio Ortega Ruiz Date: Mon Aug 20 06:15:04 2012 +0200 Racket: configurable image cache directory Brought to you by a comma-command in the REPL and the REPL startup function. elisp/geiser-racket.el | 37 +++++++++++++++++++++++++------------ scheme/racket/geiser/user.rkt | 11 ++++++++++- 2 files changed, 35 insertions(+), 13 deletions(-) commit 040f2c628c09efd64a100e47fe134d6f7a65caf2 Author: Michael W Date: Wed Aug 15 21:48:32 2012 -0600 Simplified image display. Emacs now remembers the directory that Racket put the last image in. It leaves up to 10 previously viewed images in this directory, providing an 'image history'. This also reduces memory requirements; emacs no longer reads image content into memory. elisp/geiser-repl.el | 78 +++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 35 deletions(-) commit 84e662dff7a17532c1a4d953e9123a288f575cf2 Author: Michael W Date: Wed Aug 15 21:46:54 2012 -0600 Documentation improvements elisp/geiser-repl.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit b1320af7fd30c309604ce089f28dd63f370a8ed0 Author: Michael W Date: Sun Aug 12 16:24:36 2012 -0600 [WIP] Add capability for images to be viewed in an external image viewer. elisp/geiser-repl.el | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) commit cc15e31fb57e32d5498681a1d97d6c74bcdaf0bc Author: Michael W Date: Sun Aug 12 15:12:56 2012 -0600 [WIP] Emacs cleans up temp. images, and a parameter controls whether or not they are displayed in the REPL. elisp/geiser-repl.el | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) commit 998e709f65a8bd9acfd1917d0ac4aaa47f67030b Author: Michael W Date: Sun Aug 12 12:32:03 2012 -0600 [WIP] Draw images inline in the Racket REPL. On the racket side, we use a custom print handler to print images (convertible? values; see file/convertible) in a special format: # On the geiser side, we add a comint post-output hook to search for that filename and replace it with inline images. elisp/geiser-repl.el | 11 +++++++++++ scheme/racket/geiser/user.rkt | 28 ++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) commit 540293601e7dcac9eb193d529d7b2413765f3c72 Author: Jose Antonio Ortega Ruiz Date: Sun Jul 1 02:18:55 2012 +0200 Racket: fix for module compilation for recent rackets This one probably requires Racket 5.3, and incorporates some parameterization to the module compilation and evaluation code in Geiser's version of enter.rkt. I'm mostly mirroring what the latter does, and i'm probably not completely understanding all corner cases, so the two users of Geiser should keep an eye open for possible breakage introduced by this patch. scheme/racket/geiser/enter.rkt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) commit 1312f42a54252fa4378d7dfbd68591f9e6275c1a Author: Jose Antonio Ortega Ruiz Date: Sun Jul 1 01:56:25 2012 +0200 Correctly buttonizing paths with leading spaces in DBG buffers Just adjusting a regexp. elisp/geiser-edit.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit d50d191e6e9fdb3d4f4521ea85edd426124f9797 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 9 14:24:22 2012 +0200 Support for user-defined Guile info nodes In my debian machine, the info nodes for guile live in the "guile-2.0" node, rather than plain "guile". A new customizable variable, geiser-guile-manual-lookup-nodes, lets now specify additional names, and we only add indexes to the info-lookup mode definition when the node actually exists. doc/parens.texi | 14 ++++++++++---- elisp/geiser-guile.el | 25 +++++++++++++++++++------ elisp/geiser-repl.el | 4 ++-- 3 files changed, 31 insertions(+), 12 deletions(-) commit 30231d54fb2801f4c10a952ab5e257cdd5205491 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 16 02:01:41 2012 +0200 Racket: indentation for all 'for' forms We had only for two of them, and one was wrong! elisp/geiser-racket.el | 31 ++++++++++++++++++++++++++++++- elisp/geiser-syntax.el | 2 -- 2 files changed, 30 insertions(+), 3 deletions(-) commit 40f5d8e6a09a7f010c5fc605619512f4d8e1ce98 Author: Jose Antonio Ortega Ruiz Date: Mon Apr 2 12:13:30 2012 +0200 Highlighting [else properly in Racket buffers That is, `else' gets keyword fontlocking. Undecided as to whether extend this highlighting to all schemes... elisp/geiser-racket.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) commit 9b76fa6e9927c09ad36fdf93bc8d1e570fcf6383 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 24 09:45:44 2012 +0100 ,cd for Racket REPL It's not perfect and undocumented, but useful nonetheless. scheme/racket/geiser/enter.rkt | 4 +--- scheme/racket/geiser/user.rkt | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) commit a6670bbcdc83237ae32e0fcb0c3fe95dc53255bf Author: Jose Antonio Ortega Ruiz Date: Sun Feb 5 02:11:10 2012 +0100 Keeping autodoc active in the REPL We were not re-activating it on new input, cause we weren't detecting the prompt unless preceeded by other output (and, hence, a newline). NEWS | 9 ++++++++- elisp/geiser-repl.el | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) commit 8378428fb4dd3317ba96605215d1397db0a6ae34 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 31 15:36:18 2012 +0100 Better indentation for Racket's for/hash elisp/geiser-syntax.el | 1 + 1 file changed, 1 insertion(+) commit fd617a8f0cde31ed2ddfde1cac8bd2bfb6099e79 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 17 00:15:00 2012 +0100 Correct indentation for syntax-id-rules Hat tip Marijn. elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit f3c6c8dc2d96960375e773eb86a481d678b58cfa Author: Jose Antonio Ortega Ruiz Date: Sat Nov 26 08:12:35 2011 +0100 NEWS update and version bump to 0.1.4 NEWS | 11 ++++++++++- configure.ac | 2 +- doc/macros.texi | 2 +- doc/web.texi | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) commit 9857c254979e7c43a3f432c1927a168d6437398c Author: Jose Antonio Ortega Ruiz Date: Sat Nov 26 07:11:26 2011 +0100 Racket: capturing and displaying standard error during evaluation This bugs was exposed by using rackunit, where all the output of, say, check-eq? was lost for good (it was being sent to the stderr black hole). Hat tip Grant Retkke. elisp/geiser-debug.el | 7 ++++--- elisp/geiser-racket.el | 7 +++---- scheme/racket/geiser/eval.rkt | 5 +++-- scheme/racket/geiser/modules.rkt | 26 +++++++++++++++++--------- 4 files changed, 27 insertions(+), 18 deletions(-) commit 8167ddb673800b43d78b6164673506e6d6fd6ef7 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 1 23:03:41 2011 +0200 Bug fix: avoiding sending unbalanced sexps in C-c C-r and friends We were not checking that the region sent to the scheme process was balanced, resulting in said process waiting for ever on `read' (or its moral equivalent in our current implementation). We now just refuse to evaluate an improper region in the first place. elisp/geiser-mode.el | 3 +++ 1 file changed, 3 insertions(+) commit 3a6dfbf743cc56b7d454bc6c688cd983966acc6c Author: Jose Antonio Ortega Ruiz Date: Thu Sep 29 18:43:27 2011 +0200 Racket: indentation for splicing-let and friends At some point, we should make indentation rules buffer-local. elisp/geiser-racket.el | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) commit bc4f5e2de6ece6f2d314948f742d0771b5ada858 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 29 18:40:30 2011 +0200 Documentation bit doc/macros.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit f273fa0ebbc2f94e2b0134a7e8824123fbb76f03 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 15 03:15:18 2011 +0200 Compatibility with filladapt. Seems like the add-on package filladapt.el is broken in that its version of fill-adapt uses a non-optional first argument. Aquamacs users were filling the pain. Fixed by passing nil in our call to fill-paragraph. Hat tip Jonathan Oddie. elisp/geiser-doc.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit d0b0b31399fe00b877b5dfefc2e3563aa6f257ed Author: Jose Antonio Ortega Ruiz Date: Sun Sep 11 21:35:15 2011 +0200 Guile: capturing output to standard error We were just ignoring it so far! scheme/guile/geiser/evaluation.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit ffd2cea60f6e7d8d0cf9a1fda6912b2003b92855 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 8 23:15:36 2011 +0200 bug fix: make C-c C-z behave with run-geiser The nice go-back-to-previous-scheme-buffer behaviour of C-c C-z wasn't working when the jump from a scheme file to the REPL was initiated via run-geiser. Thanks, Marijn. elisp/geiser-repl.el | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) commit d708438236cac2ee3c0a63f06eded5d9a6f38a9f Author: Jose Antonio Ortega Ruiz Date: Wed Aug 24 03:35:02 2011 +0200 Guile: deprecated format usage eliminated Actually, i'm not even sure the calls to format i was using were correct at all! scheme/guile/geiser/modules.scm | 5 ++--- scheme/guile/geiser/utils.scm | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) commit 7209628e61a2468aac259b3a53f7716a844b48dc Author: Jose Antonio Ortega Ruiz Date: Sat Aug 20 22:47:53 2011 +0200 REPL: restore TAB indenting behaviour around whitespace elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b2a931ed644123162154916e3420ee879d80ad17 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 20 20:47:53 2011 +0200 REPL: new customizable faces for input and prompt Namely, geiser-font-lock-repl-prompt and geiser-font-lock-repl-input. NEWS | 11 +++++++++++ doc/repl.texi | 30 +++++++++++++++++++----------- elisp/geiser-repl.el | 11 +++++++++++ 3 files changed, 41 insertions(+), 11 deletions(-) commit 51982d010fd4a44f93d6df3eceda6ffcebe1dbc2 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 20 18:15:07 2011 +0200 Leftover code from the previous patch removed scheme/racket/geiser/utils.rkt | 2 -- 1 file changed, 2 deletions(-) commit 1627471032647e6a13149242ad9547b5124c1c4f Author: Jose Antonio Ortega Ruiz Date: Sat Aug 20 03:31:54 2011 +0200 Racket: eval geiser-eval's apply arguments properly As Stanisław Halik reported, autodoc was receiving a mlist (instead of a list) as its argument when invoked in an R5RS context. Turns out we were evaluating geiser-eval's arguments in the wrong context (the procedure being applied and the arglist belong to the same namespace). scheme/racket/geiser/autodoc.rkt | 7 +++---- scheme/racket/geiser/user.rkt | 8 +++++--- scheme/racket/geiser/utils.rkt | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) commit 0ef26298d48bd0ae605096a187be35ef4759a722 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 20 03:23:30 2011 +0200 elisp: customizable patience amount on racket startup In this little notebook i'm using, racket takes its time to start. In fact, it can take more the previously slotted 10 seconds. Hence the new geiser-repl-startup-time variable. doc/repl.texi | 16 ++++++++++++++++ elisp/geiser-repl.el | 8 +++++++- 2 files changed, 23 insertions(+), 1 deletion(-) commit 582fe2461ebe47a54fecf1b93167d449555883cb Author: Jose Antonio Ortega Ruiz Date: Tue Aug 2 17:07:27 2011 +0200 elisp: add-hook doesn't need a defvared hook Thanks, Leo. elisp/geiser.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) commit 7acf285df13c783c07ce9570dda8ef0959e215aa Author: Jose Antonio Ortega Ruiz Date: Sun Jun 26 23:49:56 2011 +0200 Nit doc/web.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 0f992affad49eda32dd598e40038c4328e0d6b5d Author: jao Date: Thu Jun 23 02:04:10 2011 +0200 Boring preparations for 0.1.3 NEWS | 13 +++++++------ configure.ac | 2 +- doc/macros.texi | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) commit 03cffc7ba1993c79608d62f8d8c8f93606f5c882 Author: jao Date: Thu Jun 23 01:30:48 2011 +0200 NEWS update NEWS | 10 ++++++++++ 1 file changed, 10 insertions(+) commit e7c3ba0c5282999be36c4cdd67fb4f1501e73ecf Author: jao Date: Thu Jun 23 01:29:09 2011 +0200 Guile: find module when cursor is before define-module (#33497) If we didn't find a define-module form after the cursor, or an enclosing R6RS library form, we search forward for a module definition. That way, things like C-c C-a work also from the top of the file. elisp/geiser-guile.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 1fed886738b8c99e958fa6dec9948e239c93ded3 Author: jao Date: Thu Jun 23 00:40:37 2011 +0200 Irrelevant compilation warning fix Using called-interactively-p instead of interactive-p, if you have to know. The latter is deprecated as of Emacs 23.2, which the lowest version supported by Geiser. elisp/geiser-autodoc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 25052fd1f266f6eee67d7a41ab99aee797dea22a Author: jao Date: Thu Jun 23 00:33:47 2011 +0200 .gitignore update .gitignore | 1 + 1 file changed, 1 insertion(+) commit 830a0036f43341b2c5e1451ef1d7ed09b70768ec Author: jao Date: Thu Jun 23 00:32:27 2011 +0200 Avoid (read) breakage (fixes #33090) Autodoc was firing while the REPL was waiting for input of a (read) call, causing all kinds of misbehaviour. We now inhibit autodoc on sending a form for evaluation and re-inhibit it once a prompt is read back again. elisp/geiser-autodoc.el | 8 +++++++- elisp/geiser-connection.el | 4 ++++ elisp/geiser-repl.el | 11 +++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) commit 2efa614b7de69a3dc4de66f81f0de3fb48110524 Author: jao Date: Sun May 1 18:04:30 2011 -0700 Documentation fixes courtesy of M. Harig In this episode, we learn how to use @ escapes in texinfo urls. NEWS | 2 +- doc/macros.texi | 4 ++-- doc/parens.texi | 4 ++-- doc/repl.texi | 14 +++++++------- doc/thanks.texi | 12 ++++++------ 5 files changed, 18 insertions(+), 18 deletions(-) commit 04902b39229eafdfa41e2c1d5a9857133f53805d Author: Jose Antonio Ortega Ruiz Date: Mon Mar 21 12:30:11 2011 +0100 Racket: use the proper interaction port for input (#32844) Thanks to Caleb Reach. We were using current-input-port, which is not the right port in graphical environments. scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 34705d0e411aa28c8a83ca521bd7c5107a37ffd7 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 21 12:27:53 2011 +0100 Minor web nit doc/web.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit cb6f671ed83d38a7e1e41b03d4beec2a90f4551d Author: Jose Antonio Ortega Ruiz Date: Wed Mar 9 00:44:32 2011 +0100 NEWS update for 0.1.2 NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit ba5c6559a53b23238a62381a4eec64c3a5194174 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 8 22:03:45 2011 +0100 Guile: what if i do what i meant to do? Thanks Jon! NEWS | 2 ++ elisp/geiser-guile.el | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) commit 5ad2dac3dcba6a760eac16b7c23dde2f19a0056c Author: Jose Antonio Ortega Ruiz Date: Tue Mar 8 20:51:28 2011 +0100 Guile: new option for loading ~/.guile (see issue #32681) The new custom variable, geiser-guile-load-init-file-p, will be gone once Guile adquires the ability to specify the path to its init file. doc/repl.texi | 9 +++++++++ elisp/geiser-guile.el | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) commit 419985a0ec49deba4c5d0d22dc8b396916af28c6 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 16:28:20 2011 +0100 Bug fix: don't confuse REPL buffers We were not checking the implementation associated to a REPL buffer when reusing it, with much confusion ensued. elisp/geiser-repl.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) commit 5556754a5a384857a88651b449c77fd83dd1496d Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 16:10:55 2011 +0100 Missing require form elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit 30e277253513ccb274c7f2e3a131b2e82d478715 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 03:38:26 2011 +0100 Elisp nit Nothing interesting, really. elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 4077b87e8654313ea3005e7358d7ad52e0668342 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 03:33:41 2011 +0100 Mentioning Guile 2.0 instead of its git version README | 2 +- doc/install.texi | 6 ++---- doc/macros.texi | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) commit 8a0e5f1bb49ed6a8188604aaf847e804fa0e8ccf Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 03:33:09 2011 +0100 Fix for harmless elisp compilation warning elisp/geiser-eval.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 98374c61cc6de60f2fa2912ee9b5e3d199477ab7 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 6 03:18:43 2011 +0100 Racket: geiser-add-to-load-path implemented And we take the chance to lightly document the existence of this new command in the user manual. doc/cheat.texi | 6 ++++++ scheme/racket/geiser/eval.rkt | 12 +++++++++++- scheme/racket/geiser/main.rkt | 6 ++---- scheme/racket/geiser/user.rkt | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) commit 0e8be474273d6a515622334a16f2b0d34024e934 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 5 13:28:34 2011 +0100 Bug fix: honour geiser-repl-use-other-window NEWS | 5 +++-- doc/repl.texi | 4 +++- elisp/geiser-repl.el | 16 +++++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) commit 1177482fcd38d4150b5d33ddc42eb10f8a8e6b9b Author: Jose Antonio Ortega Ruiz Date: Sun Feb 27 13:52:00 2011 +0100 NEWS update Now that the previous patch seems to work (thanks David Bremner!). NEWS | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit 68a4e69aca1f8a84330def1ee24b2da6243419c0 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 27 13:14:30 2011 +0100 Racket: no errors ,entering an R5RS module The catch here is that one cannot use #%variable-reference inside an R5RS module, and, as a consequence, namespace->module-path-name was failing badly. The solution is to take note of the module name being entered before hand, and use that name in case of error (we could actually use that name always, but then cheaters using Racket's enter! would see an inconsistent name (which probably they deserve)). scheme/racket/geiser/modules.rkt | 36 +++++++++++++++++++++--------------- scheme/racket/geiser/user.rkt | 23 +++++++++++++++++------ 2 files changed, 38 insertions(+), 21 deletions(-) commit 8eac2e737ac4f7563c944f4cfec9e8075d307d78 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 27 12:53:38 2011 +0100 Whitespace, if periods are considered whitespace NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 50776ebe0b240964d0e17ce3055065d89775770c Author: Jose Antonio Ortega Ruiz Date: Fri Feb 25 16:15:16 2011 +0100 NEWS update NEWS | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 3f65b0938779e9bd045328cb90d7080b6455652e Author: Jose Antonio Ortega Ruiz Date: Fri Feb 25 16:05:11 2011 +0100 Guile: setting *current-warning-prefix* during evaluation This is a 2.0 fluid that governs how warning messages are displayed. In Geiser, we need the prefix set to an empty string so that file paths are clickable (and the display in a separate emacs buffer is nicer). scheme/guile/geiser/evaluation.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 8599a4574161a4049e3558c89f4b34f82f9e17af Author: Jose Antonio Ortega Ruiz Date: Mon Feb 14 16:48:38 2011 +0100 Bug fix: don't override customized geiser-implementations-alist elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit be34499abce0869c92a5141dd89149c180e88bb0 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 14 06:48:31 2011 +0100 Fix for the fix of the fix elisp/geiser-connection.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit ccbe0889287c3a1da10da0d315790ae9ae682239 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 14 06:25:59 2011 +0100 Fix for the fix elisp/geiser-connection.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit a6c553d0d8e3d75d5557c40288ee0e2cf8418f3d Author: Jose Antonio Ortega Ruiz Date: Mon Feb 14 06:10:50 2011 +0100 Guile REPL: bug fix: correctly track debugging status We weren't tracking the "enter debugger" event correctly, and all evaluations in debug mode were failing. There's still (at least) another bug, because error navigation in backtraces seems broken. elisp/geiser-connection.el | 25 +++++++++++++++++++------ elisp/geiser-repl.el | 7 +++++++ 2 files changed, 26 insertions(+), 6 deletions(-) commit 24ae4c34e08cd07945044f605b2d8a0306cc78c3 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 14 06:08:30 2011 +0100 Guile: indentation for `with-error-to-port` elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 6287a845e278af6ccb91fe9eb0e073fd913d3b89 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 11 23:00:15 2011 +0100 Bug fix: M-x geiser-edit-module works again in the REPL NEWS | 1 + elisp/geiser-repl.el | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) commit 168d46758ae03dc775293c60945cd6fd0513ce9a Author: Jose Antonio Ortega Ruiz Date: Wed Feb 9 23:49:50 2011 +0100 More robust retort detection Some schemes (okay, Guile) may output spurious messages besides a well-formed retort. This will be eventually fixed; in the meantime, we try to skip the noise (and may fail miserably if that noise has a form similar to the signal we search). elisp/geiser-connection.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit c676e46833fc2b38b2c21b44b7e6b52b5167329b Author: Jose Antonio Ortega Ruiz Date: Wed Feb 9 14:21:24 2011 +0100 Guile: 'format' added to the warning list elisp/geiser-guile.el | 6 +++--- scheme/guile/geiser/evaluation.scm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) commit 4be9061b98b7723b5591c86005a25d0e6692208d Author: Jose Antonio Ortega Ruiz Date: Thu Feb 3 23:23:06 2011 +0100 Off-by-one in geiser-repl-tab-dwim elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 1536e3bf322ad27f6f4a4f961efbd8510148a5d6 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 3 22:33:45 2011 +0100 New geiser-add-to-load-path, just for Guile right now As per Andy's request. Adding it to Racket (and to the user manual), shouldn't be difficult). NEWS | 7 +++- README | 74 ++++++++++++++++++++------------------- elisp/geiser-compile.el | 10 +++++- elisp/geiser-mode.el | 3 +- elisp/geiser-repl.el | 1 + scheme/guile/geiser/evaluation.scm | 11 ++++-- 6 files changed, 65 insertions(+), 41 deletions(-) commit 1eb968ccfdf86ae6d206540f84856d56e2045277 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 25 02:34:45 2011 +0100 Version bumped, lest if forget NEWS | 6 ++++++ configure.ac | 4 ++-- doc/macros.texi | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) commit 184536efb4f47be0e00e7dfd67d7b63cff942bb1 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 25 02:28:32 2011 +0100 Company fixes (module name completion) We were not handling properly mixing id and module names completion. In Guile, it's a lost cause, because module names are not identifiers and, therefore, don't share prefixes. In Racket, things are nicer in that respect: there we can offer both at once. In Guile, one at least has (thanks to this patch, too) M-`. elisp/geiser-company.el | 93 ++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 44 deletions(-) commit 89b89ec5a4bedf654517720010add2578dbffc16 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 24 23:30:03 2011 +0100 company-mode fixes (an attempt to fix #32231) i hope the anonymous reporter will check this... elisp/geiser-company.el | 7 +++---- elisp/geiser-repl.el | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) commit bc18b4415820b82af4e53158f80e74b2225c27ef Author: Jose Antonio Ortega Ruiz Date: Mon Jan 24 01:10:45 2011 +0100 More documentation nits doc/cheat.texi | 4 ++-- doc/repl.texi | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) commit 961349906f0e48139152ac1b77fa0a2273bbdbbb Author: Jose Antonio Ortega Ruiz Date: Sun Jan 23 21:55:57 2011 +0100 Documentation nits NEWS | 5 +++-- doc/cheat.texi | 1 - doc/parens.texi | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) commit 9af0e2f94eaf277ad8f4e3e57b9c0fb76327da00 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 23 21:12:29 2011 +0100 Fix for bug in module name completion (affecting Guile) elisp/geiser-completion.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) commit ba3fb44c64eac29fd0b322fb811f1983eaacf796 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 23 20:12:16 2011 +0100 geiser-repl--tab -> geiser-repl-tab-dwim Following a suggestion by M. Harig, and following the policy that it's better for command names to not be doubly hyphenated. doc/cheat.texi | 2 +- elisp/geiser-repl.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit 209110b1852fec5260e95deb9a47208c67927e2f Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 22:22:22 2011 +0100 NEWS update NEWS | 1 + 1 file changed, 1 insertion(+) commit 847fd9c4e5f847a5bf0b007c7dddf693a6857229 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 22:22:10 2011 +0100 Manual: fixes for the print edition doc/parens.texi | 8 ++++---- doc/repl.texi | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) commit 309bb67eb7b9ff06a3278eea4680a3287283c9b6 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 16:19:04 2011 +0100 Cheat sheet updated README | 2 +- doc/cheat.texi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit 0fac0de329fb7c775f123f6bef74e999de89a529 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 14:45:48 2011 +0100 C-c C-Z -> C-c C-a Since C-c C-z/Z apparently conflict with each other, and the new keybinding is more friendly anyway. doc/parens.texi | 2 +- elisp/geiser-mode.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit a11b28612594d1830ae3939c9be65cbe7f00b949 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 03:06:01 2011 +0100 Nit doc/parens.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 481d2b4f4b5ee935779b6916b58d6d9d48f89b3a Author: Jose Antonio Ortega Ruiz Date: Tue Jan 11 02:43:54 2011 +0100 More documentation fixes doc/install.texi | 7 ++++++- doc/macros.texi | 9 --------- doc/parens.texi | 52 ++++++++++++++++++++++++++++++++++++++++------------ doc/repl.texi | 17 ++++++++++++----- 4 files changed, 58 insertions(+), 27 deletions(-) commit 4b13b107c62682c7a55de18f396862dcfe01acf1 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 22:02:46 2011 +0100 Fixes for links in info manual doc/macros.texi | 8 ++++---- doc/parens.texi | 6 +++--- doc/repl.texi | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) commit 2ff0d4afe8730859d84dbe4a959d7d3147c6d495 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 20:45:00 2011 +0100 A couple more doc fixes doc/parens.texi | 6 +++--- doc/repl.texi | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) commit 8c4a672ccc24711edf61a0ef29747a870aba35f8 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 16:01:23 2011 +0100 More documentation improvements doc/parens.texi | 27 ++++++++++++++------------- doc/repl.texi | 12 ++++++------ 2 files changed, 20 insertions(+), 19 deletions(-) commit f9fbf7ee18f5de9b1608c303bb108552e041e205 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 15:32:30 2011 +0100 Manual: whitespace and missing @noindent Thanks, once again, to Mark Harig. doc/install.texi | 2 ++ doc/parens.texi | 7 +++++-- doc/repl.texi | 8 +++++--- 3 files changed, 12 insertions(+), 5 deletions(-) commit df7da58dec06aa66c5cdf3a0657ed6baee7c0150 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 15:31:40 2011 +0100 Manual: copyright text to the beginning of Top node doc/geiser.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 99bf1fc9e86cd575c58e2a5e3fc7914109302568 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 15:30:38 2011 +0100 Fix for index.texi's @node doc/index.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit f5a5313f480998d295bccac6a063085c49d296d4 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 10 03:01:12 2011 +0100 NEWS and doc typo NEWS | 12 +++++++----- doc/repl.texi | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) commit e1673221200c35bdacffebbcc26c2e562080a9fd Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 22:40:11 2011 +0100 Racket: ',enter "foo"' as a synonym of ',enter (file "foo")' doc/repl.texi | 25 +++++++++++++++---------- elisp/geiser-racket.el | 4 ++-- scheme/racket/geiser/user.rkt | 3 ++- 3 files changed, 19 insertions(+), 13 deletions(-) commit 8d8d07981ebb0d7c605ed4efa3e6fe16a4fd8894 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 17:53:29 2011 +0100 README updates README | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit a6570238dae92bbd9e9a66ea3d148d1db259bd55 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 17:47:24 2011 +0100 NEWS update NEWS | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) commit d4e243581e6e00be43ddfd829d4a960f1dfb4c2f Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 17:37:59 2011 +0100 Texinfo macrology doc/geiser.css | 4 ++++ doc/install.texi | 11 ++++++----- doc/macros.texi | 18 ++++++++++++++++++ doc/web.texi | 8 +------- 4 files changed, 29 insertions(+), 12 deletions(-) commit 87340e7700af9a24441bc5c6047a92b85f5c7bb8 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 16:49:40 2011 +0100 Docs: better rendering of links in info doc/install.texi | 22 +++++++++++++--------- doc/macros.texi | 32 ++++++++++++++++++++++++++------ doc/parens.texi | 40 ++++++++++++++++++++++++---------------- doc/repl.texi | 31 ++++++++++++++++++------------- 4 files changed, 81 insertions(+), 44 deletions(-) commit 5f50bcd86d436a598bf9d61f5bcfd7f985338d01 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 02:16:02 2011 +0100 Doc nit doc/repl.texi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) commit 9c3c0202f536b67ae83ef974fa4c743fb888b29b Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 02:12:43 2011 +0100 Docs: community links added doc/thanks.texi | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) commit 0fae4e8805e68565a6d4ca26c07b4cdff6a971cf Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 01:38:22 2011 +0100 Docstring typos Mark, again. elisp/geiser-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 642cdfd59c66c29d35cf302e3e2fb0137fa062ed Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 01:36:41 2011 +0100 Guile nit scheme/guile/geiser/emacs.scm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) commit 7c74bab99cfb5a51ed435853fe09e46407c7b3bf Author: Jose Antonio Ortega Ruiz Date: Sun Jan 9 00:06:46 2011 +0100 Autodoc mode (de)activation fix. Quoth Mark: When the Geiser minor mode is toggled off using the command `geiser-mode', the message: Toggling eldoc-mode off; better pass an explicit argument. is displayed in the echo area. This is traceable to line 219: (eldoc-mode geiser-autodoc-mode) The function `eldoc-mode' takes numeric arguments, while `geiser-autodoc-mode' returns boolean values. Here is a simple patch: (eldoc-mode (if geiser-autodoc-mode 1 -1)) elisp/geiser-autodoc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 963b9d4214a04f2d1c13230d5e69f3e422819d99 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 8 22:20:23 2011 +0100 Info formatting (whitespace around code blocks) doc/install.texi | 20 ++++++++++++++++++-- doc/parens.texi | 30 +++++++++++++++++++++--------- doc/repl.texi | 4 ++++ 3 files changed, 43 insertions(+), 11 deletions(-) commit e2710ee3d9ccffebe67f9a1b16fb7cf88a789655 Author: Jose Antonio Ortega Ruiz Date: Sat Jan 8 13:26:03 2011 +0100 Docs: two spaces after period in texinfo sources. Thanks to MH, who did all the heavy lifting. doc/cheat.texi | 2 +- doc/install.texi | 40 +++++++------- doc/intro.texi | 16 +++--- doc/parens.texi | 164 ++++++++++++++++++++++++++++---------------------------- doc/repl.texi | 132 ++++++++++++++++++++++----------------------- doc/thanks.texi | 2 +- doc/top.texi | 8 +-- 7 files changed, 182 insertions(+), 182 deletions(-) commit 7ba4e724f79ed7cc307b1337412be61eead5daa9 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 19:43:12 2011 +0100 Docs: cheat sheet corrections doc/cheat.texi | 111 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 56 insertions(+), 55 deletions(-) commit 425e29e070c0860aec004296e050b92cb9250b89 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 19:42:51 2011 +0100 REPL: M-TAB bound to completion-at-point TAB already does all the other stuff. elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 439c043037f5846e18f42893cab09b9e66109e12 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 19:04:18 2011 +0100 Yet another doc nit doc/repl.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 68abcf73367753b5b412d9d377f1840c412dffd5 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 18:59:18 2011 +0100 Doc nit doc/parens.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e7c4ef3400f3227737b1445f7fe1bf4884b1c55d Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 18:56:16 2011 +0100 Documentation typos (thanks to Mark Harig) doc/cheat.texi | 6 +++--- doc/install.texi | 4 ++-- doc/intro.texi | 12 ++++++------ doc/parens.texi | 54 +++++++++++++++++++++++++++--------------------------- doc/repl.texi | 27 ++++++++++++++------------- 5 files changed, 52 insertions(+), 51 deletions(-) commit 2ca4ad6e1385e2ea21f05f6760db0e0ff5cca4c3 Author: Jose Antonio Ortega Ruiz Date: Fri Jan 7 14:14:31 2011 +0100 REPL: fix for history navigation We were using a comint-get-old-input function that was including the prompt in its returned value. This was no problem most of the time because we don't use comint-send-input before the process mark, but there's another circumstance under which comint-get-old-input is called, namely, when reaching the end of the input history. When history is exhausted, the "old input" is inserted (go figure), and we were inserting a prompt, wreaking havoc with its read-only-ness. elisp/geiser-repl.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit 7342870bfce4071673936597559ae60ffcba03b2 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 3 01:45:13 2011 +0100 Really avoiding *spurious* buffers My previous attempt was bogus! Also, i'm taking advantage of our sending queries serially to simplify transaction queue processing, and to clean after ourserlves on error. elisp/geiser-connection.el | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) commit 95af5d35139f8d8825dcfa2381a5bc16d46e0043 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 2 21:03:00 2011 +0100 More robust symbol reading (instead of specializing for quack) Let's use the scheme reader instead of half-assed regular expressions and special-casing. elisp/geiser-syntax.el | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) commit 31215149401ca11ca6365109411206e25b6a3b6d Author: Jose Antonio Ortega Ruiz Date: Sun Jan 2 20:38:25 2011 +0100 More quackisms elisp/geiser-syntax.el | 2 ++ 1 file changed, 2 insertions(+) commit f275952d107ea4553a45fefefed51d74b2d94183 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 2 19:58:16 2011 +0100 Fix for quack users Apparently, quack makes (thing-at-point 'symbol) to return "#" when point is looking at a hash symbol, causing havoc to geiser. This patch defends us about this behaviour. elisp/geiser-syntax.el | 1 + 1 file changed, 1 insertion(+) commit 4826d33808c8c54bbe455639c942fc3f789383c0 Author: Jose Antonio Ortega Ruiz Date: Thu Dec 30 15:58:13 2010 +0100 A bit of documentation doc/parens.texi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit d2601ace1339835acd542e2fa03d214b38c1f663 Author: Jose Antonio Ortega Ruiz Date: Thu Dec 30 15:44:09 2010 +0100 New command: "manual" autodoc (C-c C-d s) doc/cheat.texi | 8 ++++++++ doc/parens.texi | 5 ++++- elisp/geiser-autodoc.el | 13 ++++++++++--- elisp/geiser-mode.el | 2 ++ 4 files changed, 24 insertions(+), 4 deletions(-) commit b355f7fb31d19ac680eef38005035a95414a2612 Author: Jose Antonio Ortega Ruiz Date: Thu Dec 30 13:57:17 2010 +0100 Autodoc nit elisp/geiser-autodoc.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 8982bb6bb2afce626cd60533cb582ae88259a402 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 16:25:52 2010 +0100 Leaner autodoc cache We cannot consistently maintain a local cache, because of re-evaluations of external symbols will go unnoticed. The new strategy (remembering only the latest signatures) mostly works, although it introduces a bit of extra flickering every now and then. A global cache is perhaps worth considering. elisp/geiser-autodoc.el | 44 ++++++++++++++++---------------------------- elisp/geiser-compile.el | 2 +- 2 files changed, 17 insertions(+), 29 deletions(-) commit 466b8f71a7d6375f55b2806fb949a91d774147c6 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 15:48:41 2010 +0100 Less noisy autodoc mode activation Only display an activation message when called interactively. elisp/geiser-autodoc.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit ab63255f7dbb1a4eed6f00d5c08309b169a166f3 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 04:19:09 2010 +0100 Bug fix for postfix error message display in debug buffer The message and the evaluated expression where getting mixed for Guile. elisp/geiser-debug.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit fe8de4b31e916c1f1883826cade2c8dc310afe48 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 04:11:46 2010 +0100 Finer grained maintenance of autodoc's cache elisp/geiser-autodoc.el | 11 +++++++++-- elisp/geiser-compile.el | 2 +- elisp/geiser-debug.el | 7 +++++-- elisp/geiser-syntax.el | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) commit 2a582ee40aa77ff4d05baef3e2ea4449615cd93f Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 03:39:28 2010 +0100 Avoiding autodoc interfering with an active minibuffer A piece of eldoc advice shamelessly lifted from slime. elisp/geiser-autodoc.el | 11 +++++++++++ 1 file changed, 11 insertions(+) commit ef55123a1cb33f0d8e555060d66f508db51122f2 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 03:29:13 2010 +0100 Wee refactoring elisp/geiser-autodoc.el | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) commit d05e8e0e2323a654e8e8f81214750b2819fcbc8e Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 03:18:00 2010 +0100 First stab at asynchronous autodoc retrieval elisp/geiser-autodoc.el | 53 +++++++++++++++++++++++++------------------------- elisp/geiser-company.el | 2 +- elisp/geiser-eval.el | 6 ++++++ 3 files changed, 33 insertions(+), 28 deletions(-) commit f0e5d02619ead5688f051f14030cb700323e6c17 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 03:16:52 2010 +0100 Bug fix: autodoc was skipping some identifiers Namely, those with non-letters in their name, because we were using "%S" instead of "%s" to stringify uninterned symbols. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 9c356f882c7cb084e8abddc50404d9a0675bb477 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 01:36:27 2010 +0100 Bug fix: properly enqueue requests I've observed that autodoc requests in connections to tekuti processes often miss their deadline. This was causing serialization problems, fixed (i think) by this patch; but we still have the problem of too many misses, which could be fixed by making autodoc asynchronous (and we probably need this for really remote connections anyway). elisp/geiser-connection.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 97cbd01379a9f337433e48292566e942c6e1973c Author: Jose Antonio Ortega Ruiz Date: Tue Dec 28 01:33:56 2010 +0100 Web page: version in main page doc/geiser.css | 6 ++++-- doc/web.texi | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) commit 9a75286b505a7be1cfbc54ba0d70c54e8457e527 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 21 16:15:16 2010 +0100 Documentation helpers doc/geiser.css | 10 +++++++++- doc/install.texi | 5 ++--- doc/intro.texi | 2 +- doc/macros.texi | 1 + doc/web.texi | 6 ++++++ 5 files changed, 19 insertions(+), 5 deletions(-) commit a700f8280f05155a1a45463d5cf0aab762035ba3 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 20 04:15:58 2010 +0100 Documentation tidbits doc/install.texi | 19 ++++++++++--------- doc/macros.texi | 5 +++++ 2 files changed, 15 insertions(+), 9 deletions(-) commit 01fdd0cad6ecfc2eecd81a5999767e1583999207 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 20 03:28:01 2010 +0100 Version bump: let the fun begin! configure.ac | 2 +- doc/install.texi | 2 +- doc/macros.texi | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) commit c82a944025ee08280dc507004ab98435f184cc23 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 20 03:08:06 2010 +0100 Nits and release tag doc/install.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit c826eb2e462ed8d2ab2ae8be5050d79e478db796 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 20 01:21:34 2010 +0100 Latest updates before 0.1 NEWS | 4 ++++ doc/Makefile.am | 1 - doc/install.texi | 55 ++++++++++++++++++++++++++++++++++++------------------- doc/macros.texi | 2 ++ 4 files changed, 42 insertions(+), 20 deletions(-) commit ea2af4ac14c3351094377bc06f41232de9a6fb94 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 18 16:02:46 2010 +0100 Missing autoload for connect-to-racket Maybe i should bite the bullet and use ##autoload cookies, but then geiser.el would need to be a generated file, breaking out-of-the-boxness (unless i update it by hand). Sticking to manual maintenance for now. elisp/geiser.el | 3 +++ 1 file changed, 3 insertions(+) commit c369a98132d38affe0bee659f33181db694c9e52 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 18 04:45:38 2010 +0100 Docs: clarification about quack Greg Hendershott tells me that, unless you require quack after loading geiser, quack's font lock is somehow ignored. I have yet to understand why. doc/install.texi | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) commit ee5a005c6ea72219b7ceec510214543a48e8026d Author: Jose Antonio Ortega Ruiz Date: Sat Dec 18 04:21:16 2010 +0100 Docs nit doc/install.texi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 4b7a1b2afe0630e5b4c02f6cbe23bee53aa62eb9 Author: Jose Antonio Ortega Ruiz Date: Wed Dec 15 19:18:04 2010 +0100 A quack compatibility bit If quack-mode is active, we leave additional font locking to it. elisp/geiser-syntax.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit 176b84f5aedc1bb23d91337b10570981e9af7545 Author: Jose Antonio Ortega Ruiz Date: Tue Dec 14 23:21:23 2010 +0100 Debugging aids A couple functions to manage logs, and a fix to the definition of geiser-messages-mode: do not ever kill all local variables in a derived mode definition! elisp/geiser-log.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) commit 8cac1fd62779f6552ce4e5ac5d8f9a886526420d Author: Jose Antonio Ortega Ruiz Date: Tue Dec 14 22:57:18 2010 +0100 No more vicious error circle on tq errors I've eliminated the annoying *spurious* popup produced by tq, so that Geiser can recover from error conditions arising from unexpected input to a transaction queue that has no active transaction. We now log the offending input and keep going. Greg, over at racket's list, reported such a happening when leaving the REPL after C-u C-c C-z; but i've been unable to reproduce the problem. Probably, we have a bug lurking somewhere that this patch doesn't fix, but at least it should work as a palliative. elisp/geiser-connection.el | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) commit 41f4dcc669f809dd3a73f78b81f50f780f152aeb Author: Jose Antonio Ortega Ruiz Date: Sat Dec 11 04:24:14 2010 +0100 Documentation bit doc/cheat.texi | 3 +++ 1 file changed, 3 insertions(+) commit dfe2b83ff6eb51cbaf134b5cdfc1e416c1541b8b Author: Jose Antonio Ortega Ruiz Date: Sat Dec 11 04:05:57 2010 +0100 Documentation updates, and a shiny new image doc/img/docstring-racket.png | Bin 0 -> 12733 bytes doc/img/docstring.png | Bin 16390 -> 16361 bytes doc/parens.texi | 11 ++++++++--- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 doc/img/docstring-racket.png commit 4a156187b4918e934c30ea2403d8dcb57cfcc720 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 11 03:03:00 2010 +0100 Make the position of long expressions in debug buffer customizable This is Emacs, after all. elisp/geiser-debug.el | 35 +++++++++++++++++++++++++++++++---- elisp/geiser.el | 1 + 2 files changed, 32 insertions(+), 4 deletions(-) commit 45dbc624fcb57134c02db510a7f3ba50b09f4d88 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 11 02:47:56 2010 +0100 Print long expressions after errors in debug buffer. You won't believe it, but people write procedures spanning several pages, even in Scheme. Where's the art and the poetry of programming? elisp/geiser-debug.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) commit d655282cc2bb6146782cb5c8ea3dafdccaeecef9 Author: Jose Antonio Ortega Ruiz Date: Mon Dec 6 22:03:57 2010 +0100 We need Emacs 23.2 at least The new completion machinery Geiser uses was introduced there. README | 8 +++++--- doc/install.texi | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) commit 21e65eb32c09d8524ec61b12a70a4f7f1379eedf Author: Jose Antonio Ortega Ruiz Date: Mon Nov 29 02:06:46 2010 +0100 Locals scanning: support for let-values and let*-values ... and i haven't yet refactored `geiser-syntax--scan-locals', oh my. elisp/geiser-syntax.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) commit e4f87fdc18d4aef2c4e7c3602ac3975f2140fae1 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 29 01:42:37 2010 +0100 Fixes for locals scanning ... using the new non-interning reader. Plus scanning for case-lambda and syntax-rules. `geiser-syntax--scan-locals' is in danger of refactoring, specially if we add support for let-values. elisp/geiser-completion.el | 6 ++-- elisp/geiser-racket.el | 20 +++++++----- elisp/geiser-syntax.el | 83 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 70 insertions(+), 39 deletions(-) commit d70e9de59cfeae4fa8e76a48dbfe80e9d25e0d7c Author: Jose Antonio Ortega Ruiz Date: Sun Nov 28 16:09:03 2010 +0100 Autodoc's argument display fixed It was relying on symbol equality, and not dealing correctly with keyword arguments in this new external world. In the process, some cleanups to the scheme data display code. elisp/geiser-autodoc.el | 25 +++++++++---------------- elisp/geiser-syntax.el | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 16 deletions(-) commit e61a8e7c9068fab436b657ed42c1df2f73a8b6f3 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 28 16:07:42 2010 +0100 Avoiding keyword internalisation We were still internalizing scheme _keywords_ in the elisp reader. elisp/geiser-syntax.el | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) commit 02be05e46fe1499e758e14a821a3e809647f8989 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 28 16:05:26 2010 +0100 Doc browser nit elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 690a60c33834fb1a615a0ceb4dead08713612776 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 28 02:56:31 2010 +0100 Racket: #lang, require and provide as keywords Those seem keywordish enough to deserve fontification. elisp/geiser-racket.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) commit 1e312c9d83a3a9c4bd7c4bf5cfd4b1802cc0aada Author: Jose Antonio Ortega Ruiz Date: Sat Nov 27 01:51:21 2010 +0100 Fix for xref sorting by module Since, you know, module names are now uninterned symbols. elisp/geiser-xref.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit b39fd77d8899bc7ff6608645afc9e2eb0eb0d33c Author: Jose Antonio Ortega Ruiz Date: Sat Nov 27 00:54:59 2010 +0100 No more interning in the scheme reader We avoid using elisp's read for symbols, reading uninterned ones instead. And then, we cannot use symbols as keys in responses from scheme: we're using strings instead. elisp/geiser-autodoc.el | 14 +++++++------- elisp/geiser-doc.el | 16 ++++++++-------- elisp/geiser-edit.el | 10 +++++----- elisp/geiser-syntax.el | 9 +++++++-- elisp/geiser-xref.el | 16 ++++++++-------- scheme/guile/geiser/doc.scm | 29 ++++++++++++++--------------- scheme/guile/geiser/utils.scm | 4 ++-- scheme/guile/geiser/xref.scm | 8 +++----- scheme/racket/geiser/autodoc.rkt | 36 ++++++++++++++++++------------------ scheme/racket/geiser/locations.rkt | 6 +++--- 10 files changed, 75 insertions(+), 73 deletions(-) commit 96610db57a61d5380eeeb3b4780846c39fb79422 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 23:11:47 2010 +0100 A couple of uses of intern replaced by make-symbol These ones seem safe: the resulting symbol is not compared for equality anywhere. elisp/geiser-company.el | 4 ++-- elisp/geiser-racket.el | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit 88c56a06fd1d006f1d41dfce16c89da79e03bb5b Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 23:05:34 2010 +0100 Autodoc not interning symbols We avoid calling symbol-at-point, and keep the cached signatures with strings as keys. elisp/geiser-autodoc.el | 19 +++++++++++-------- elisp/geiser-syntax.el | 14 +++++++++----- 2 files changed, 20 insertions(+), 13 deletions(-) commit 775b81c9be65b71a1d3090d5b80398a82ffc54f2 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 21:52:31 2010 +0100 Remove unnecessary calls to symbol-at-point ... which interns the symbol in the global obarray: rather unfriendly. We still need to remove a few calls to that beast, and avoid intern in the scheme reader. elisp/geiser-base.el | 4 ++++ elisp/geiser-completion.el | 2 +- elisp/geiser-doc.el | 10 +++++----- elisp/geiser-edit.el | 2 +- elisp/geiser-mode.el | 12 +++++++----- elisp/geiser-repl.el | 10 +++++----- elisp/geiser-xref.el | 4 ++-- 7 files changed, 25 insertions(+), 19 deletions(-) commit 0233627d20dd483745c8386b2eb5ff26b355f854 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 16:12:24 2010 +0100 Doc browser: better link highlighting We were adding extra spaces to function signatures. elisp/geiser-autodoc.el | 5 +++-- elisp/geiser-doc.el | 19 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) commit 931c38b796dd90897c7039aa7a9afde70131dbb8 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 16:11:45 2010 +0100 Nit elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 18250d15e5f80deca6d6db10c8deda7b58efa0ba Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 15:19:49 2010 +0100 Revert "Bug fix: don't intern symbols read by scheme reader" This reverts commit 801422d1558f488059ede4f9abab5163ca610900. We cannot blindly substitute make-symbol for intern in the scheme reader, because we rely on symbol equality elsewhere, often. The fix will have to be much more careful. elisp/geiser-base.el | 1 + elisp/geiser-company.el | 4 ++-- elisp/geiser-guile.el | 3 +-- elisp/geiser-impl.el | 4 ++-- elisp/geiser-racket.el | 2 +- elisp/geiser-syntax.el | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) commit 801422d1558f488059ede4f9abab5163ca610900 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 14:45:00 2010 +0100 Bug fix: don't intern symbols read by scheme reader We were calling `intern' instead of `make-symbol', polluting emacs' obarray. elisp/geiser-base.el | 1 - elisp/geiser-company.el | 4 ++-- elisp/geiser-guile.el | 3 ++- elisp/geiser-impl.el | 4 ++-- elisp/geiser-racket.el | 2 +- elisp/geiser-syntax.el | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) commit f661d7c70bd04542d8bbb4da9c9f70b6d6c95791 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 26 02:29:25 2010 +0100 Racket: more information in symbol documentation When the symbol is imported and re-exported by a second module, we display its definition name and original module, besides the name of the module re-exporting it. elisp/geiser-doc.el | 6 ++--- elisp/geiser-racket.el | 2 +- scheme/racket/geiser/autodoc.rkt | 58 ++++++++++++++++++++++++++++++++++------- scheme/racket/geiser/modules.rkt | 7 +++++ 4 files changed, 59 insertions(+), 14 deletions(-) commit 59e53577aff12df02f437b95f46dc2951157eb10 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 23:25:20 2010 +0100 Bug fix: unbreaking the doc browser elisp/geiser-doc.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) commit d1535ee213ed9dc98a0d0897dc5525d70f4318c5 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 22:47:30 2010 +0100 Link to symbol's module in doc browser But i should really refactor this: module and value are (or can be) already available in the response coming from Scheme. elisp/geiser-doc.el | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) commit d2e44120a83f55e98598bd8d2c7e10f577b97324 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 21:01:19 2010 +0100 Tidier titles for doc browser Just justifying and indenting them. elisp/geiser-doc.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) commit 56db9f728629e0859cafa34b53d8a16f34eeef01 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 18:52:25 2010 +0100 Completion: a bit of documentation doc/parens.texi | 21 ++++++++++++++++----- doc/repl.texi | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) commit ca4761af930caef19427863af75b576ce611d2e4 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 18:26:07 2010 +0100 Completion: respecting tab-always-indent ... and actually using it to implement geiser-smart-tab-mode. Always nice to un-reinvent-the-wheel. elisp/geiser-completion.el | 26 +++++++++----------------- elisp/geiser-mode.el | 3 ++- elisp/geiser-repl.el | 5 ++++- 3 files changed, 15 insertions(+), 19 deletions(-) commit 310f00bbea4b70a25bd0e7d2337a589433f14b31 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 04:28:02 2010 +0100 First stab at using Emacs' standard completion mechanism Besides removing code i didn't understand that well, we bring in goodies such as partial completion. Jolly. elisp/geiser-company.el | 2 +- elisp/geiser-completion.el | 186 +++++++++++----------------------------------- 2 files changed, 45 insertions(+), 143 deletions(-) commit acffa001cd9effa4a74261ac9b72e736b9b61937 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 01:30:48 2010 +0100 Guile: fixes for documentation display We put the value of the identifier where it belongs, and add a missing period. Works, but geiser/doc.scm is in sore need of a refactoring. scheme/guile/geiser/doc.scm | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) commit 1417c2bc5090c362d341dc2e77a2623b56ea9753 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 01:29:06 2010 +0100 Guile: fix for connect-to-guile problems Was a real bug, after all, and quite reproducible. Sending an ,use metacommand was not returning a prompt, and we were waiting for ever to start (or almost). Now, connect-to-guile is not only right, but spiffy again. elisp/geiser-guile.el | 20 +++++++++----------- elisp/geiser-repl.el | 4 ---- 2 files changed, 9 insertions(+), 15 deletions(-) commit 094ecfb5c755b5f92ae993b685efdf98191b00c1 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 25 00:04:11 2010 +0100 Guile: logging initialisation process Today, W was seeing errors when connecting to Guile, which of course immediately disappeared when we tried to reproduce them and get some logs. I'm logging Guile's initialisation unconditionally, to make sure the problem doesn't repeat. Much easier than fixing the bug. elisp/geiser-guile.el | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) commit 62d88632a400367ea117f2b2d8d734c3c391b703 Author: Jose Antonio Ortega Ruiz Date: Wed Nov 24 23:46:33 2010 +0100 Doc browser: help echo for buttons elisp/geiser-doc.el | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) commit d9e03e068d621cd8252ec15765d058be3ccd5f9d Author: Jose Antonio Ortega Ruiz Date: Wed Nov 24 02:14:11 2010 +0100 Guile: button for texinfo lookup in doc browser elisp/geiser-doc.el | 13 +++++++++---- elisp/geiser-guile.el | 28 +++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) commit 992649e9e6f977943cbae191e3bc057a0393e7ad Author: Jose Antonio Ortega Ruiz Date: Tue Nov 23 02:15:14 2010 +0100 Lookup is a name, look up, a verb README | 1 + doc/cheat.texi | 4 ++-- doc/parens.texi | 2 +- elisp/geiser-doc.el | 4 ++-- elisp/geiser-mode.el | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) commit 3b24e917fdfebc8df3fefbbcc747963eb4bbd126 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 23 01:58:33 2010 +0100 Document browser improvements, and Racket using them We have a new "manual lookup" command, and Racket now displays a doc browser buffer for help with a button activating it. In the process, we've cleaned-up a little mess in geiser-eval.el and geiser-doc.el, and refactored the affected Racket modules. Next in line is providing manual lookup for Guile. doc/cheat.texi | 3 + doc/img/geiser-mode.png | Bin 62445 -> 37636 bytes doc/img/repl-mod.png | Bin 29938 -> 30503 bytes doc/parens.texi | 33 ++++++-- doc/repl.texi | 40 ++++----- elisp/geiser-completion.el | 11 +-- elisp/geiser-doc.el | 168 ++++++++++++++++++++++---------------- elisp/geiser-eval.el | 20 +++-- elisp/geiser-mode.el | 2 + elisp/geiser-racket.el | 2 +- scheme/guile/geiser/evaluation.scm | 2 - scheme/racket/geiser/autodoc.rkt | 75 +++++++++++------ scheme/racket/geiser/locations.rkt | 11 +-- scheme/racket/geiser/main.rkt | 2 + scheme/racket/geiser/modules.rkt | 21 ++++- 15 files changed, 243 insertions(+), 147 deletions(-) commit a53249b83cdc0711f23b1b8860cd3582977230c6 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 22 04:22:45 2010 +0100 Fix for geiser-smart-tab-mode elisp/geiser-completion.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit 39042ae7410842439430133d42207cc0b45b154d Author: Jose Antonio Ortega Ruiz Date: Mon Nov 22 03:34:45 2010 +0100 Fix for compiled Geiser geiser-repl was missing a (require 'geiser-doc) that was making things go pretty awry for compiled geiser on os x (emacs 23.2.20), but nowhere else, for reasons that escape me. Issue was, the popup buffer macros were not seen. Go figure. elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit 52c02593734d33d439815f90f118e954367a2d81 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 22 00:46:28 2010 +0100 Fix for error in Guile initialisation elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit a13ecebab407cf7c7a2e3938a1a1f2c436208a2e Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 19:01:36 2010 +0100 Doc browser: section navigation cmmands Details, details. README | 32 ++++++++++++++++++-------------- doc/cheat.texi | 17 ++++++++++++----- elisp/geiser-doc.el | 44 +++++++++++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 32 deletions(-) commit 80bc0ec73440eb060646d0e511e60a269ca0ee7e Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 17:34:21 2010 +0100 Nits configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit d1404867c6a335e8f4469ee12500e9fefb0dad3e Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 16:57:55 2010 +0100 CLisms removed elisp/geiser-autodoc.el | 2 +- elisp/geiser-completion.el | 4 ++-- elisp/geiser-doc.el | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) commit f531c3e0f5afda77ada497d3932ea10502e22bdb Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 16:12:41 2010 +0100 Racket: showing submodules in module help elisp/geiser-racket.el | 7 ++-- scheme/Makefile.am | 2 +- scheme/racket/geiser.rkt | 23 ------------ scheme/racket/geiser/autodoc.rkt | 5 +-- scheme/racket/geiser/completions.rkt | 2 -- scheme/racket/geiser/modules.rkt | 71 ++++++++++++++++++++++++++++--------- scheme/racket/geiser/startup.rkt | 23 ++++++++++++ scheme/racket/geiser/user.rkt | 4 +-- 8 files changed, 88 insertions(+), 49 deletions(-) delete mode 100644 scheme/racket/geiser.rkt create mode 100644 scheme/racket/geiser/startup.rkt commit de6b4addba49abbb43f07c8e153356308bcd8709 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 07:48:22 2010 +0100 Did i mention that getting autodoc right is hard? elisp/geiser-autodoc.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit 398cdbed93912ee863f111eb7048a252d232391c Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 05:30:34 2010 +0100 Even better message on completion failure elisp/geiser-completion.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) commit 629f38d05e35faba3655936c68500785dba148a2 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 05:25:37 2010 +0100 Better message on completion failure Tell people that we're trying to complete, sometimes, on two different prefixes. elisp/geiser-completion.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) commit eefc4cddbc303b6de38b9b0d80ac591e6282fd5c Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 05:24:36 2010 +0100 Correct display of "..." in autodoc It'd be interesting to check what percentage of commits are related to autodoc... elisp/geiser-autodoc.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 8ebfa570ad6a722a831c53a0229464055bf227c3 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 03:50:41 2010 +0100 Racket: slightly better handling of the signatures cache Refreshing the cache on form evaluation (had been deactivated by error since the introduction of meta-commands). The current behaviour is not yet completely correct: if one evaluates a form in a modified buffer, geiser won't notice the new definition's signature, not even after the buffer is saved if one has gone around asking for autodoc before that. An improvement would be to make the cache sensitive to file write times, as suggested back in the day by Eli & Neil. scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b437f54ca8154356f8f576f14f4c167f7f1fa8ff Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 02:30:04 2010 +0100 Even better, as in 'correct', display of autodoc args We're being a bit silly here, first converting the autodoc retort string to an elisp value and then reconverting the arguments again to a string with scheme syntax. We should probably do this at geiser-syntax's parser level, with a special mode producing stringy representations of tokens. Don't tell anyone. elisp/geiser-autodoc.el | 17 ++++++++++++----- elisp/geiser-doc.el | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) commit 1710566476f5230d95e43cdceeab3487df76b69e Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 02:00:34 2010 +0100 Bug fix: (symbol-at-point) thinks that '.' is a symbol And, as a consequence, we were sending broken sexps to poor schemes. elisp/geiser-syntax.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 1d725a8c087b66b2cd2c0e5006c376faf612d6ff Author: Jose Antonio Ortega Ruiz Date: Sun Nov 21 01:56:02 2010 +0100 Better module help We now display procedure signatures in module help, and keep a cache in Guile, using procedure properties. doc/img/repl-mod.png | Bin 17604 -> 29938 bytes elisp/geiser-doc.el | 32 +++++++++++-------- scheme/guile/geiser/doc.scm | 62 +++++++++++++++++++++++++++++-------- scheme/guile/geiser/modules.scm | 34 +-------------------- scheme/guile/geiser/utils.scm | 8 +++++ scheme/racket/geiser/autodoc.rkt | 66 +++++++++++++++++++++++++++++++++------- scheme/racket/geiser/eval.rkt | 12 ++------ scheme/racket/geiser/main.rkt | 16 +++++++--- scheme/racket/geiser/modules.rkt | 35 ++------------------- 9 files changed, 149 insertions(+), 116 deletions(-) commit 481f0ea2e5577ad5bb1a718b8023af92202e7423 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 19 21:13:56 2010 +0100 Better argument display in autodoc Simpler (we don't need no square brackets) and more correct (keywords display as keywords and we only include default values when available (Guile, i'm looking at you). doc/img/autodoc-scm.png | Bin 0 -> 18208 bytes doc/img/repl-autodoc.png | Bin 44150 -> 13953 bytes doc/parens.texi | 31 ++++++++++++++++--------------- doc/repl.texi | 6 +++--- elisp/geiser-autodoc.el | 36 +++++++++++++++++++----------------- 5 files changed, 38 insertions(+), 35 deletions(-) create mode 100644 doc/img/autodoc-scm.png commit f6b03b27810e70304b89fd6185437dcf35d27b94 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 15 04:05:51 2010 +0100 CLism removed copy-list is from cl. elisp/geiser-impl.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) commit 2cf00aa48f879c692da445b80a0dd93b4838c90d Author: Jose Antonio Ortega Ruiz Date: Mon Nov 15 03:59:47 2010 +0100 REPL: sexpy history file (fix for #30269) The trick consists on using a comint-input-ring-separator that is *not* a newline, both for reading and writing the history file. elisp/geiser-impl.el | 4 +++- elisp/geiser-repl.el | 35 ++++++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 10 deletions(-) commit d0f026d2211905027804bcaa7c43e2c0d055322b Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 23:18:40 2010 +0100 Better geiser-implementation-help (for Geiser hackers) elisp/geiser-impl.el | 78 +++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 38 deletions(-) commit 61cb503bbb8d1ff42bc2656ce9c0b93d11d84ad6 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 22:38:16 2010 +0100 Documentation for define-geiser-implementation You don't really care unless you're a Geiser hacker (as opposed to a hacker using Geiser), or wanna become one. elisp/geiser-impl.el | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) commit 4f1d94031dd370cc77a1b4eaa484bcab159f941e Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 22:36:17 2010 +0100 Smoother REPL exit (deactivating the connection) elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit 6d64c4f1a19862d88d0429cd60f42c811e4007a6 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 22:01:48 2010 +0100 geiser-implementation-help, for Geiser hackers This interactive command will list all method needed to define a new Scheme implementation in Geiser, together with their callers and doc strings. Although i know very few additional schemes meta-dynamic enough to be supported by Geiser (actually, just one: scheme48), one never knows (there was a time when i thought that PLT Scheme wasn't in the list). elisp/geiser-impl.el | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) commit e061494c211c86001f8391f331e2a9f3df0d17ae Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 20:59:26 2010 +0100 Typo elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit a07fcbb866082f533acbe89e028d05d4a3904b2a Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 20:19:10 2010 +0100 Support for implementation-specific font lock keywords Spinning up from correct fontification of [else in this brave Racket world. I'm keeping the list of extra keywords lean and mean, but making it customizable in both Racket and Guile. elisp/geiser-guile.el | 15 ++++++++++++++- elisp/geiser-mode.el | 4 +++- elisp/geiser-racket.el | 13 +++++++++++++ elisp/geiser-syntax.el | 16 ++++++++++++++++ scheme/racket/geiser/autodoc.rkt | 2 -- scheme/racket/geiser/eval.rkt | 2 -- scheme/racket/geiser/user.rkt | 10 +++++----- 7 files changed, 51 insertions(+), 11 deletions(-) commit 39d79b5b02bfa183715996b15e7b3ca2b87973b9 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 14 20:16:46 2010 +0100 Smoother reload Let's not wait for active connections to clear their queue when we're shutting down the REPL. elisp/geiser-connection.el | 48 +++++++++++++++++++---------------------------- elisp/geiser-repl.el | 2 +- 2 files changed, 20 insertions(+), 30 deletions(-) commit 579bf848c75cb2f4920227c2ac2a4535eb676eca Author: Jose Antonio Ortega Ruiz Date: Sat Nov 13 04:40:31 2010 +0100 completion-base-position <- completion-base-size The latter is obsolete since 23.2. elisp/geiser-completion.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) commit 102d79f1af0aa0ec1acfa4ff30d4d9897663a4e8 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 13 03:45:07 2010 +0100 Cleanups Nothing here, move on. elisp/geiser-connection.el | 6 +----- elisp/geiser-repl.el | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) commit 69efb94a50ca6e8120a7a08d6ccf8216625c8519 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 13 02:31:39 2010 +0100 geiser-mode-auto-p: automatic geiser-mode is now optional It hadn't occurred to me that anyone wouldn't want non-automatic geiser-mode often enough to require its own customization variable. Rotty proved me wrong. Or maybe not, but he deserves a custom var! doc/parens.texi | 9 +++------ elisp/geiser-mode.el | 9 +++++++++ elisp/geiser.el | 4 +++- 3 files changed, 15 insertions(+), 7 deletions(-) commit 1853b281918ea8c6e143ed1cfe1950189956d076 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 13 02:07:19 2010 +0100 Superior schemes Inferior schemes weren't really a good idea, were they? With remote connections one can launch an external scheme to debug Geiser anyway. And everything is (ahem, will be) simpler when we add new implementations. elisp/Makefile.am | 1 - elisp/geiser-guile.el | 17 +----- elisp/geiser-inf.el | 89 ----------------------------- elisp/geiser-racket.el | 4 -- elisp/geiser-repl.el | 129 ++++++++++++++++++++++++------------------- scheme/racket/geiser/user.rkt | 6 +- 6 files changed, 77 insertions(+), 169 deletions(-) delete mode 100644 elisp/geiser-inf.el commit 6e9d4a346b4a947259b564063c0c3186e51670e0 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 23:44:17 2010 +0100 Hiding a bit inferior scheme buffers By prefixing their name with a space... an argument against inferior schemes, btw, is that they raise the barrier to entry for new schemes: they must provide a networked REPL server. elisp/geiser-inf.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e070d76166d249695f1d2ee0269cc5c91537e0c9 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 22:55:40 2010 +0100 Make do with a single connection Separate connections for the REPL and Geiser commands was kind of neat, but it had the problem of synchronising the current namespace for both connections. A quick fix would have been to ask the scheme for the current namespace for every Geiser command in the REPL, but that, besides clunky, would add potentially prohibitive overhead for (real) remote connections. As it happens, using a single connection turned out to be not that difficult and relatively clean code-wise. We could even turn back to not use inferior schemes, and the net result of this refactoring would be the replacement of comint-redirect (which wasn't able to match the whole EOT token if it didn't arrive all at once) by transaction queues (which also makes geiser-connection's implementation cleaner). But using an inferior scheme has a dog-food value, and allows external processes to connect to the scheme being used by Geiser without further ado, which could be useful for debugging (although this is a lame excuse: nothing prevents you from starting a REPL server from emacs if you want). We'll see. elisp/geiser-connection.el | 49 +++++++++++++++++++++++++-------------- elisp/geiser-guile.el | 20 +++++++++------- elisp/geiser-racket.el | 14 +++++------ elisp/geiser-repl.el | 29 ++++++++++++----------- scheme/guile/geiser/evaluation.scm | 1 - scheme/racket/geiser/eval.rkt | 1 - 6 files changed, 65 insertions(+), 49 deletions(-) commit c4287cdbb796507575a71a2bfc589f0f107f436f Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 15:41:06 2010 +0100 Debugger support, and Guile using it elisp/geiser-connection.el | 15 ++++++++++----- elisp/geiser-guile.el | 7 ++++--- elisp/geiser-repl.el | 8 ++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) commit e13172c2855cc7fcb30c6dac231210c6e8534b18 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 02:20:14 2010 +0100 Better EOT token for more robust communication elisp/geiser-connection.el | 10 +++++----- elisp/geiser-guile.el | 4 ++-- elisp/geiser-repl.el | 5 ++++- scheme/guile/geiser/evaluation.scm | 1 + scheme/racket/geiser/eval.rkt | 3 ++- 5 files changed, 14 insertions(+), 9 deletions(-) commit dc8155b5d0e5c533a1fc6cb64399e8cccd7c1716 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 01:33:09 2010 +0100 Guile reconnected (but not debuggable (yet)) Or the importance of EOL. Switching to a transaction queue for communication with the Scheme process means that i had to care about sending eols in the queries... Guile was waiting for ever reading a metacommand taking a variable number of arguments. Argh: this has taken me a few hours -- i'm getting old. elisp/geiser-guile.el | 37 +++++++++++++++++++++++-------------- elisp/geiser-racket.el | 1 - elisp/geiser-repl.el | 6 +++--- scheme/guile/geiser/emacs.scm | 23 +++++++++++++++++------ scheme/guile/geiser/evaluation.scm | 18 ++++-------------- 5 files changed, 47 insertions(+), 38 deletions(-) commit 24fe735860a68542bb569bb59c712995f7bd1deb Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 01:29:04 2010 +0100 Avoiding clobbering scm-strings with properties Apparently, (format "%s" sym) for a symbol read from a buffer where it's fontified, produces a string with the same fontification. Go figure. elisp/geiser-eval.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit b98b2cea6ca2a5b244bbb4270d1144e483e54455 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 12 01:27:22 2010 +0100 Nits bin/geiser-racket.sh | 2 +- elisp/geiser-connection.el | 25 ++++++++++++------------- elisp/geiser-inf.el | 2 +- elisp/geiser-racket.el | 4 ++-- 4 files changed, 16 insertions(+), 17 deletions(-) commit 70cfa5b379e90e6899c7e1a210a5c468dc578479 Merge: 8d1e1c4 5a7c055 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 11 16:28:52 2010 +0100 Merge branch 'guile-meta' into meta-reconnection commit 8d1e1c47563131cd0f52f0cc02fa0b23eebd2227 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 11 16:27:01 2010 +0100 Racket reconnected bin/geiser-racket.sh | 6 ++--- elisp/geiser-inf.el | 24 ++++++++++------- elisp/geiser-repl.el | 50 ++++++++++++++++++++++++----------- scheme/racket/geiser.rkt | 4 +-- scheme/racket/geiser/server.rkt | 12 ++------- scheme/racket/geiser/user.rkt | 59 ++++++++++++++++++++++++++++++++---------- 6 files changed, 102 insertions(+), 53 deletions(-) commit d773c05503659047f35878bd745568ce04078148 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 11 03:31:15 2010 +0100 Elisp support for inferior schemes elisp/geiser-guile.el | 1 - elisp/geiser-inf.el | 2 +- elisp/geiser-racket.el | 3 +++ elisp/geiser-repl.el | 37 +++++++++++++++++++++++-------------- 4 files changed, 27 insertions(+), 16 deletions(-) commit dfc900c0e2f59edfb06bbdabfc4bcde172d6ced9 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 11 03:01:33 2010 +0100 Partial work (connections working) doc/cheat.texi | 3 - doc/repl.texi | 13 +- elisp/Makefile.am | 1 + elisp/geiser-connection.el | 274 +++++++++++++---------------------- elisp/geiser-eval.el | 10 +- elisp/geiser-inf.el | 83 +++++++++++ elisp/geiser-log.el | 1 - elisp/geiser-racket.el | 1 - elisp/geiser-reload.el | 1 + elisp/geiser-repl.el | 338 ++++++++++++++++++++----------------------- scheme/racket/geiser/user.rkt | 8 +- 11 files changed, 347 insertions(+), 386 deletions(-) create mode 100644 elisp/geiser-inf.el commit 5a7c0553d5b60cd9475ecb33c5d65b76789757e0 Merge: 27916d2 3db4017 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 9 21:55:22 2010 +0100 Merge branch 'master' into guile-meta commit 3db4017f11317c497fba0e97adb5fd1a18ca4534 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 9 21:54:44 2010 +0100 Missing racket file in scheme/Makefile.am scheme/Makefile.am | 1 + 1 file changed, 1 insertion(+) commit 27916d2da2e43f231daff12249b19701f5a27b4f Merge: d830e14 f2bf4b2 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 9 21:52:56 2010 +0100 Merge branch 'master' into guile-meta Conflicts: elisp/geiser-guile.el commit f2bf4b2cda05fe8c32ee74ce3b5cce743d81de61 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 9 21:35:50 2010 +0100 Racket: remote REPLs .gitignore | 1 + Makefile.am | 2 +- bin/Makefile.am | 15 +++++++++++ bin/geiser-racket.sh | 19 +++++++++++++ configure.ac | 1 + doc/repl.texi | 60 +++++++++++++++++++++++++++++------------- elisp/geiser-connection.el | 57 +++++++++++++++++---------------------- elisp/geiser-racket.el | 12 +++++++++ scheme/racket/geiser/server.rkt | 24 +++++++++++++++++ 9 files changed, 138 insertions(+), 53 deletions(-) create mode 100644 bin/Makefile.am create mode 100755 bin/geiser-racket.sh create mode 100644 scheme/racket/geiser/server.rkt commit 512fa06fec02b7dc8ce11684313f7a0ab56bef6b Author: Jose Antonio Ortega Ruiz Date: Tue Nov 9 02:38:49 2010 +0100 Elisp buggettes and warnings elisp/geiser-connection.el | 2 +- elisp/geiser-guile.el | 7 ++++--- elisp/geiser-mode.el | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) commit 32cf1a718868d83b58b426ba7e1eeb32ea9f80b5 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 06:15:51 2010 +0100 README nit README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b6201fbf064e1f3dcbb579b54cc1d49c3b8c9493 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 06:11:15 2010 +0100 Documentation typos doc/parens.texi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 27e21627ad8e3021d49dcbd781ff5bde97fd471b Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 06:07:12 2010 +0100 squarify again, now with numeric prefix doc/parens.texi | 4 +++- elisp/geiser-mode.el | 35 +++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 13 deletions(-) commit f8acd072a81821c6ebb3a8bf7e057f45243e7810 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 05:44:18 2010 +0100 geiser-squarify to toggle between () and [] README | 1 + doc/cheat.texi | 3 +++ doc/parens.texi | 4 ++++ elisp/geiser-mode.el | 19 +++++++++++++++++++ scheme/racket/geiser/user.rkt | 16 ++++++++-------- 5 files changed, 35 insertions(+), 8 deletions(-) commit ca4e24ea7c39abb47683e68bac42807f2fe79eb0 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 05:43:58 2010 +0100 Let geiser-connect take optional host and port args elisp/geiser-repl.el | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) commit 73451229ea7f9ba26199851bc19aafabde900e78 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 04:39:39 2010 +0100 Tweakings in switch-to-geiser (multiple REPLs) elisp/geiser-repl.el | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) commit 39d0ccb19d7c390f306374987219b1d599902bdc Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 04:05:31 2010 +0100 Better handling of REPL's header line elisp/geiser-repl.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) commit f04b9429de1cb815c2ad680603077be6a0d10132 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 04:00:53 2010 +0100 Racket: fix for prompt display on ,enter scheme/racket/geiser/user.rkt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) commit 6a197dae0735eb92f66ee98a8ca4137eac7649ee Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 03:39:36 2010 +0100 Racket: use EOT token for internal communications elisp/geiser-racket.el | 1 + scheme/racket/geiser/eval.rkt | 16 ++++++---------- scheme/racket/geiser/modules.rkt | 4 ++++ scheme/racket/geiser/user.rkt | 32 ++++++++++++++++++++------------ 4 files changed, 31 insertions(+), 22 deletions(-) commit a73fdcb10bb6144d7befbc4c553102c9816e86c9 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 8 03:38:44 2010 +0100 Connection plumbing: ability to specify EOT token added elisp/geiser-connection.el | 91 +++++++++++++++++++++++++---------------------- elisp/geiser-eval.el | 6 ---- 2 files changed, 49 insertions(+), 48 deletions(-) commit 3e1ed908aa73875bda5842d6d9ce4c8b2d76bfb4 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 18:41:32 2010 +0100 Interruptible connection waiting elisp/geiser-connection.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e7aa01584d9b54e47855f2bcc434ab4c253126d5 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 18:29:25 2010 +0100 Better connection logs elisp/geiser-connection.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) commit 61caa87e24a26196f529938b51d1e46373598e7f Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 18:27:36 2010 +0100 Nit scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 3ba17b64dfd84a313fdb631c0127de7f54218465 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 17:31:09 2010 +0100 Pumbling cleanups elisp/geiser-connection.el | 118 +++++++++++++++++++++++----------------------- elisp/geiser-racket.el | 4 +- elisp/geiser-repl.el | 3 +- 3 files changed, 64 insertions(+), 61 deletions(-) commit 682e386ab7e2a78b64d2420d4f4c014bc86be256 Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 03:40:37 2010 +0100 Nits elisp/geiser-connection.el | 9 +++++---- scheme/racket/geiser/eval.rkt | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) commit d4a74bed9729a0f737fc4f363199a54da934d8ac Author: Jose Antonio Ortega Ruiz Date: Sun Nov 7 02:57:38 2010 +0100 Completion: not completing the empty string elisp/geiser-completion.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit bf929cd8408277dab16d7fa1a2bc9fd5ba8559e2 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 23:18:51 2010 +0100 Completion: falling back to module name completion for real elisp/geiser-completion.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 4146821a9d3256ae33ce035269bc0358c4e51d80 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 22:56:48 2010 +0100 Doc fix doc/parens.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit ce1f3543d0339813f85677178b8dcd06953fd2e9 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 22:19:07 2010 +0100 REPL: remembering last connection address elisp/geiser-repl.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit 2aad392f96e8fdf6040c3761171045e25fb0a8c9 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 21:42:09 2010 +0100 Racket: little evaluation nits elisp/geiser-eval.el | 1 + elisp/geiser-racket.el | 7 ++++--- scheme/racket/geiser.rkt | 1 + scheme/racket/geiser/eval.rkt | 9 +++++---- scheme/racket/geiser/modules.rkt | 2 +- scheme/racket/geiser/user.rkt | 22 ++++++++++++++++------ 6 files changed, 28 insertions(+), 14 deletions(-) commit f972d32e556e305936e4aa9f1249fe2846e07a20 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 14:22:53 2010 +0100 Manual nits doc/Makefile.am | 2 +- doc/fun.texi | 488 -------------------------------------------------------- doc/geiser.css | 1 + doc/geiser.texi | 2 +- doc/install.texi | 2 +- doc/intro.texi | 12 +- doc/macros.texi | 4 - doc/parens.texi | 488 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/repl.texi | 42 ++--- doc/web.texi | 2 +- 10 files changed, 520 insertions(+), 523 deletions(-) delete mode 100644 doc/fun.texi create mode 100644 doc/parens.texi commit 545ed6843fb39f6ed6ef6d7cb28fe8e4cc07e1c5 Author: Jose Antonio Ortega Ruiz Date: Sat Nov 6 12:37:07 2010 +0100 Manual: more precise docs on completion doc/fun.texi | 8 +++++--- doc/repl.texi | 13 ++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) commit 0320e46e6babf242450dc7e2ade6803213a52090 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 5 21:17:36 2010 +0100 Documentation nits doc/repl.texi | 3 ++- doc/thanks.texi | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) commit 6cc325d0c53f074054c645eae42f2305c01f6b4f Author: Jose Antonio Ortega Ruiz Date: Fri Nov 5 03:15:15 2010 +0100 Documentation tweaking doc/cheat.texi | 13 +++++++------ doc/fun.texi | 18 +++++++++--------- doc/geiser.texi | 4 ++-- doc/repl.texi | 2 +- doc/web.texi | 2 +- 5 files changed, 20 insertions(+), 19 deletions(-) commit cb4eaabc1e18b91f1f34899110edf62482163a5b Author: Jose Antonio Ortega Ruiz Date: Fri Nov 5 03:01:07 2010 +0100 Documentation fix doc/cheat.texi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit b8992fe0b5ab24c66f9d58f61ed9d52ea378d4bf Author: Jose Antonio Ortega Ruiz Date: Fri Nov 5 02:57:15 2010 +0100 Fix for TAB in REPL, and BACKTAB going to previous error doc/cheat.texi | 7 +++++++ elisp/geiser-repl.el | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) commit 95968c5dff4c8128a377d241436b6454c31c2e69 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 5 01:58:28 2010 +0100 Racket: fix for help function elisp/geiser-racket.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 46a3aa955952156554ea45e8f44af792d0f14669 Author: Jose Antonio Ortega Ruiz Date: Thu Nov 4 22:36:03 2010 +0100 Manual: image update and grammatical error doc/img/repl-mod.png | Bin 13151 -> 17604 bytes doc/repl.texi | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) commit 2b84012e105c3f798bbae51c989edb7258d0714b Author: Jose Antonio Ortega Ruiz Date: Thu Nov 4 22:02:54 2010 +0100 Implementation guessing for scripts with #! ... guile elisp/geiser-guile.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit d830e14a4010284b4085d9942bfd856b0360d793 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 1 05:16:55 2010 +0100 Better error message for edit-symbol-at-point elisp/geiser-edit.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit ea42746970657bc05b31c462a01df21d079e4a9e Author: Jose Antonio Ortega Ruiz Date: Mon Nov 1 01:45:58 2010 +0100 Guile: better meta-command args handling elisp/geiser-guile.el | 26 +++++--------------------- scheme/guile/geiser/emacs.scm | 2 +- 2 files changed, 6 insertions(+), 22 deletions(-) commit e3edc4db496c012da1cf4d406b94bd752ea79622 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 1 00:43:10 2010 +0100 Guile: fix for the argument shortening algorithm elisp/geiser-guile.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 375e6549f8662d1316b24a8211d0507430f941c5 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 1 00:19:23 2010 +0100 Guile: shorten a bit more multi-line sexps sent to REPL elisp/geiser-guile.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 83b1e75799d56b33dbbcb56b3bc5f8741e3f4cd4 Author: Jose Antonio Ortega Ruiz Date: Mon Nov 1 00:03:31 2010 +0100 Guile: suppress embedded comments when sending multi-line sexps elisp/geiser-guile.el | 7 +++++++ 1 file changed, 7 insertions(+) commit 03e7271ffdc381e69aae401666df56767799e836 Merge: ffd0a91 2603c39 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 20:04:45 2010 +0100 Merge branch 'master' into guile-meta commit 2603c39ff801aa860420d65b589dfe831240d05d Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 20:03:16 2010 +0100 REPL: TAB when away from last prompt goes to next error elisp/geiser-repl.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) commit df85a7034789007da33e2b3a5efc12a32e53a651 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 19:47:40 2010 +0100 REPL: RET on an error jumps to it elisp/geiser-repl.el | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) commit ffd0a91a136909c4ed481184073e868ae886e230 Merge: 449a5c9 9325189 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 15:53:12 2010 +0100 Merge branch 'master' into guile-meta commit 9325189d4b3cfa2207c015b4f60cf397089edc9f Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 15:51:57 2010 +0100 Informational logs disabled by default Set geiser-log-verbose-p to t to enable all logs. Calling geiser-show-logs with a prefix argument will do that for you. elisp/geiser-log.el | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) commit dff681a7e5641f350c0d18c178b7401e75b107d6 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 15:13:19 2010 +0100 Always fallback to edit-module in M-. elisp/geiser-completion.el | 5 +++++ elisp/geiser-edit.el | 16 ++++++++++++++-- scheme/guile/geiser/doc.scm | 13 +++++++------ 3 files changed, 26 insertions(+), 8 deletions(-) commit e57b89e952cd050f746033a0d40a817211fb5be1 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 15:08:50 2010 +0100 Simple tables (not yet used) elisp/geiser-table.el | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 elisp/geiser-table.el commit 5d8a2feb0bc211945518f761c7fffcbb2dd3ff32 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 03:48:53 2010 +0100 Missing, if thankful, texi file doc/thanks.texi | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 doc/thanks.texi commit 7dbe4a28668ebc601d1f468bd97063bd27c70083 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 03:40:08 2010 +0100 Documented thanks THANKS | 9 +++++++-- doc/Makefile.am | 1 + doc/cheat.texi | 2 +- doc/geiser.texi | 11 ++--------- doc/index.texi | 2 +- doc/web.texi | 2 ++ 6 files changed, 14 insertions(+), 13 deletions(-) commit bc8ff863ec10cb70b89b4af1983ba1fde0cd3841 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:42:04 2010 +0100 Fix for geiser-doc-module elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit af8cd551c9ed6cac332fcb4cfa17c5143b9d48a5 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:34:30 2010 +0100 Autodoc: fix for improper macro arglists scanning scheme/guile/geiser/doc.scm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) commit 3d67d9292879f4c5ff50c7326091192293419630 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:04:40 2010 +0100 Fix for geiser-edit-module elisp/geiser-edit.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 449a5c9a05feed4f743d98172f78b250c6258d7a Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:42:04 2010 +0100 Fix for geiser-doc-module elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 52f219c47fc5aa1831735823530c83bb34056aef Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:34:30 2010 +0100 Autodoc: fix for improper macro arglists scanning scheme/guile/geiser/doc.scm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) commit 41c403b1b18bbf8b780dbf06f9445a43b602803b Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 02:04:40 2010 +0100 Fix for geiser-edit-module elisp/geiser-edit.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e0dca7b01b40b3548f03298a16dee252f310a567 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 31 01:46:29 2010 +0200 Guile: reactivating the debugger during evaluation elisp/geiser-guile.el | 2 +- scheme/guile/geiser/emacs.scm | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) commit 32592d3fd04db3a9facd9061d20c6ff7da2ce8f8 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 23:49:06 2010 +0200 Guile: debug leftover deleted scheme/guile/geiser/emacs.scm | 1 - 1 file changed, 1 deletion(-) commit 35e1b306eb7df8449d05d07596c62281bcee7736 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 23:48:18 2010 +0200 Guile: really support R6RS libs elisp/geiser-guile.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) commit 1edb6056df59a119296916a0d4a14b9887e4baa5 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 22:51:45 2010 +0200 Guile: recognizing R6RS libraries as modules elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 7fe12503929dd8557a6daee1ad33d91ceef9293b Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 22:46:12 2010 +0200 Guile: using meta-commands to talk with Guile elisp/geiser-guile.el | 31 ++++++++++++++++--------- scheme/guile/geiser/emacs.scm | 48 +++++++++++++++++---------------------- scheme/guile/geiser/evaluation.scm | 17 +++++++++----- 3 files changed, 52 insertions(+), 44 deletions(-) commit 8e0535dff68717c4073d0933e304a7ad8c803870 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 15:46:15 2010 +0200 Documentation update to mention new ,enter in Racket doc/img/repl-autodoc.png | Bin 54293 -> 44150 bytes doc/repl.texi | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) commit b729d11c255065781e0df9b7a9b2be68a93fafb1 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 15:45:40 2010 +0200 Racket: ,eval -> ,geiser-eval elisp/geiser-racket.el | 7 ++++--- scheme/racket/geiser/user.rkt | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) commit 19adb11523a6a1b87ae8dda7c1734db3ca476ddc Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 05:02:43 2010 +0200 Racket: using meta-commands instead of dynamic-require (#30347) - Much more robust: dynamic-require might not have been defined in the REPL's namespace. - Fixes #30347 as a side-effect: now all Geiser functions work with typed scheme too. elisp/geiser-racket.el | 19 +++++++++++++------ scheme/racket/geiser/eval.rkt | 6 ++---- 2 files changed, 15 insertions(+), 10 deletions(-) commit 25efa35db669a3994fc1a4df7462633adfb6941d Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 04:58:57 2010 +0200 Guile: using the new syntax for sending eval requests elisp/geiser-guile.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) commit 89e1f6444208bc70deeeca765f212296ed11c634 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 04:57:31 2010 +0200 Elisp: more flexible parsing of :eval and :ge forms This allows the implementation decide the concrete structure of the code sent to the REPL. For instance, it doesn't need to be a single s-expression, and argument order can be re-arranged. elisp/geiser-autodoc.el | 2 +- elisp/geiser-compile.el | 2 +- elisp/geiser-completion.el | 4 ++-- elisp/geiser-debug.el | 4 ++-- elisp/geiser-doc.el | 4 ++-- elisp/geiser-edit.el | 6 +++--- elisp/geiser-eval.el | 41 +++++++++++++++++++++++------------------ elisp/geiser-repl.el | 3 +-- elisp/geiser-xref.el | 2 +- 9 files changed, 36 insertions(+), 32 deletions(-) commit d89131b0ff58fb6d8d12fa0404f2b0d26e964d72 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 30 04:54:59 2010 +0200 Racket: new meta-commands: ,eval ,apply ,no-values scheme/racket/geiser/user.rkt | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) commit 13f8a9c96e791d9f3ea1b0b73e77d2497b5e95a9 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 29 22:51:19 2010 +0200 Racket: ,enter meta-command instead of namespace clobbering elisp/geiser-racket.el | 6 ++--- scheme/racket/geiser/user.rkt | 55 +++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 34 deletions(-) commit c6add83b9dd772070e71a6ac2f61fdd948f8b52f Author: Jose Antonio Ortega Ruiz Date: Fri Oct 29 03:50:29 2010 +0200 Thanks where thanks are due THANKS | 4 ++++ 1 file changed, 4 insertions(+) commit 7121a03cb28386db9c0d034cfb175a8b8f8be9c1 Author: Jose Antonio Ortega Ruiz Date: Sun Oct 24 00:26:05 2010 +0200 Locals completion: a fix and an extension - ((foo wasn't being completed - define-syntax makes its first argument a bound local elisp/geiser-completion.el | 2 +- elisp/geiser-syntax.el | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) commit caf962e8deffd840c67ef591613125638ff03d97 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 23 16:12:02 2010 +0200 Using smart tab mode in REPL doc/fun.texi | 3 ++- elisp/geiser-guile.el | 4 ++-- elisp/geiser-repl.el | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) commit 48333a4d4593b2d616855e50e3211537d210624f Author: Jose Antonio Ortega Ruiz Date: Sat Oct 23 12:50:50 2010 +0200 A proper (let's hope) fix for the sluggishness problem elisp/geiser-syntax.el | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) commit 145c5c15cdc0345bafa0e172c68f1a481ee3a19e Author: Jose Antonio Ortega Ruiz Date: Sat Oct 23 01:06:15 2010 +0200 Temporary fix for sluggishness while scanning big forms elisp/geiser-syntax.el | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) commit bafa50637979082e65300cd985e278076910ba62 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 21 20:29:30 2010 +0200 Doc fix doc/fun.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit bb25fc4b46e9b82d9e0f119e30f2bda30c5e12d0 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 16 03:36:49 2010 +0200 Manual: cheat sheet README | 5 +- doc/Makefile.am | 2 +- doc/cheat.texi | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/fun.texi | 2 +- doc/geiser.texi | 12 +++- doc/index.texi | 2 +- doc/web.texi | 2 + 7 files changed, 194 insertions(+), 9 deletions(-) create mode 100644 doc/cheat.texi commit fcfcf8f8dfd0a01dd269822fe9e44716f86be3c1 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 16 02:11:24 2010 +0200 Bug fix: setting correct default-directory in debug buffers elisp/geiser-debug.el | 2 ++ 1 file changed, 2 insertions(+) commit 9da96b7c7d959fb0005b562c923203d21050b4cb Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 22:59:32 2010 +0200 Racket nit: racket/base instead of scheme/base scheme/racket/geiser/user.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit d8e54ebda76c034f48342e8ee7f2b7901c9bc674 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 22:57:44 2010 +0200 Documentation for M-. and modules README | 48 +++++++++++++++++++++++------------------------- doc/fun.texi | 5 ++++- doc/repl.texi | 4 +++- 3 files changed, 30 insertions(+), 27 deletions(-) commit 9e0401cb0d864af44372e60be642f57b4895a1ad Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 19:31:03 2010 +0200 Documentation for smart-tab mode README | 185 ++++++++++++++++++++++++++++++++++++++++++++++++ README.org | 229 ------------------------------------------------------------ doc/fun.texi | 8 +++ 3 files changed, 193 insertions(+), 229 deletions(-) create mode 100644 README delete mode 100644 README.org commit 85104cd220c6b694a93f486656802b046cba1a79 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 18:16:20 2010 +0200 README tweaks README.org | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) commit 6d9b904089f4f7b407aa19769b2bc66c95e89132 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 17:05:49 2010 +0200 README -> README.org README | 182 -------------------------------------------------------------- README.org | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+), 182 deletions(-) delete mode 100644 README create mode 100644 README.org commit dd9afea0677c99620a1543e06e86712465728681 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 16:56:23 2010 +0200 Documentation bit doc/repl.texi | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) commit 28e90a3c097fc903765cdcbfd2a0bdac4a37c444 Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 16:39:06 2010 +0200 Whitespace elisp/geiser-edit.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit c1821b6269d541ae632158252f427cf98481966b Author: Jose Antonio Ortega Ruiz Date: Fri Oct 15 16:33:23 2010 +0200 Documentation nits doc/repl.texi | 2 ++ doc/site.conf | 3 +++ 2 files changed, 5 insertions(+) commit 800218e25fda834a04d7823633e8f966d53940e0 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 13 20:33:11 2010 +0200 README fix README | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) commit 443b3399a1efbea581694e856b67095e9dbaad51 Author: Jose Antonio Ortega Ruiz Date: Tue Oct 12 00:28:00 2010 +0200 Menus: callers/callees active only if available elisp/geiser-eval.el | 3 +++ elisp/geiser-mode.el | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 4322100bb18d2b00f409730dcd3985e56f8d4124 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 12:47:28 2010 +0200 Fix for the fix elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 20381927f97fea260de42656f539fecf1e45bd1b Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 12:46:36 2010 +0200 Bug fix: connect-to-guile wasn't interactive elisp/geiser-guile.el | 1 + 1 file changed, 1 insertion(+) commit 7df2a764d6091736814766eef21a073165c84bd8 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 03:26:56 2010 +0200 A bit more documentation on remote REPLs doc/repl.texi | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) commit a680bcf2c24eb97b61bc4a3b5b043740b9064887 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 03:10:30 2010 +0200 Documentation for remote REPLs doc/repl.texi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) commit aa3b4233fd2ce19bd3de6759173172e014ef2f63 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 02:25:34 2010 +0200 Guile: remote REPLs (connect-to-guile) geiser-connect (or its specialisation, connect-to-guile) working for Guile, where the external process is started with the new --listen flag. elisp/geiser-guile.el | 12 +++++++++++- elisp/geiser.el | 3 +++ scheme/guile/geiser/evaluation.scm | 23 +++++++++++++---------- 3 files changed, 27 insertions(+), 11 deletions(-) commit 30824831a0211277769ddcbaee431321c603bc03 Author: Jose Antonio Ortega Ruiz Date: Mon Oct 11 02:23:26 2010 +0200 Remote REPLs: elisp support (geiser-connect) New user command geiser-connect, which will try to connect to a remote server and use it in the REPL. elisp/geiser-repl.el | 70 +++++++++++++++++++++++++++++++++++++++++++---------- elisp/geiser.el | 11 +++++---- 2 files changed, 63 insertions(+), 18 deletions(-) commit 6cca3627152fa6f4cd3c38c908db820fdc7eac98 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 6 02:34:51 2010 +0200 Autodoc: fix for position scanning and current symbol Fixes scan of current symbol when point is in a string or comment and detection of argument boundaries. elisp/geiser-syntax.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit de4041d918ce90680bfddf9aa8430f8295dcea1e Author: Jose Antonio Ortega Ruiz Date: Wed Oct 6 01:57:18 2010 +0200 Fixes for scanning of locals during completion elisp/geiser-syntax.el | 70 +++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 30 deletions(-) commit 8170fdab0cf35cf12d1dc091b6232ac4d22fe1a5 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 6 00:53:07 2010 +0200 Use cl only at compile time elisp/geiser-autodoc.el | 2 +- elisp/geiser-base.el | 16 +++++-------- elisp/geiser-completion.el | 9 +++----- elisp/geiser-syntax.el | 57 ++++++++++++++++++++++++++--------------------- 4 files changed, 40 insertions(+), 44 deletions(-) commit 2b0ff9f520839d7389ddb9e2354c709a1ce401d4 Author: Jose Antonio Ortega Ruiz Date: Wed Oct 6 00:45:48 2010 +0200 Documentation nits doc/install.texi | 2 +- doc/repl.texi | 2 +- elisp/geiser-guile.el | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) commit 9ac52eca64ed44c9a7fc3d716b685cc71f005d36 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 12 19:20:47 2010 +0200 Docs: include images only in HTML pages doc/fun.texi | 8 ++++---- doc/geiser.texi | 3 ++- doc/macros.texi | 11 ++++++++--- doc/repl.texi | 8 ++++---- 4 files changed, 18 insertions(+), 12 deletions(-) commit c1fab42b7d6ca1ea2bdf0898057b041f82e02a21 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 12 01:59:47 2010 +0200 More documentation doc/fun.texi | 72 +++++++++++++++++++++++++++++++++----------- doc/img/eval-error.png | Bin 27374 -> 27433 bytes doc/img/guile-eval-error.png | Bin 0 -> 22733 bytes doc/repl.texi | 21 +++++++------ 4 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 doc/img/guile-eval-error.png commit f67278cd012fd9a0dd9c830f2d66966ebfacc55d Author: Jose Antonio Ortega Ruiz Date: Sun Sep 12 01:59:24 2010 +0200 Couple nits elisp/geiser-edit.el | 2 +- elisp/geiser-racket.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 5a2b4648fc9c4212fe19e8794fc2b15230710b95 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 11 22:47:08 2010 +0200 Racket: support for gracket-text elisp/geiser-racket.el | 36 ++++++++++++++++++++++++++++++------ elisp/geiser.el | 7 ++++--- 2 files changed, 34 insertions(+), 9 deletions(-) commit 5a3362429fc4b3daee7cab0718f2c1cadc467ab3 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 11 22:46:10 2010 +0200 A better way of doing the above elisp/geiser-base.el | 11 ++++++++++- elisp/geiser-repl.el | 4 +--- 2 files changed, 11 insertions(+), 4 deletions(-) commit 2c6127d54ed940a988ffc31a7285400d6df16e32 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 11 22:40:19 2010 +0200 Silent autodoc message when starting REPL elisp/geiser-repl.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) commit e70c2887af00bb60b7dad37aa0654751233bdcd3 Author: Jose Antonio Ortega Ruiz Date: Wed Sep 8 01:34:48 2010 +0200 Better REPL exit command elisp/geiser-guile.el | 31 +++++++++++++++++-------------- elisp/geiser-racket.el | 4 ++++ elisp/geiser-repl.el | 38 +++++++++++++++++++++++++++++--------- 3 files changed, 50 insertions(+), 23 deletions(-) commit 9e072c67041be2a9968d153ab6a6de3c047bc0f0 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 05:58:22 2010 +0200 Guile: configurable warning level elisp/geiser-guile.el | 34 ++++++++++++++++++++++++++++++++- scheme/guile/geiser/emacs.scm | 16 +++++++++++----- scheme/guile/geiser/evaluation.scm | 40 ++++++++++++++++++++++++++++++--------- 3 files changed, 75 insertions(+), 15 deletions(-) commit 9ecfebdfd5d3361c643c2b16b9fb7771122b0e82 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 05:58:05 2010 +0200 Reuse soruce window when navigating errors elisp/geiser-edit.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit acd2cde3b603bcc48dc02337398f7418bad3fa29 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 01:45:18 2010 +0200 Make next-error (C-x `) work on debug buffers elisp/geiser-debug.el | 2 ++ elisp/geiser-edit.el | 30 +++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) commit 841681e4360b08820bf1e9e0b260a83139d30911 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 00:32:22 2010 +0200 Guile: fix bug in error display elisp/geiser-guile.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit 34cfc967b6d377c4c2a795aba692a3652f21bb49 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 00:22:52 2010 +0200 Guile: evaluation warnings scheme/guile/geiser/evaluation.scm | 49 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 18 deletions(-) commit 911a1fc178d9399a62b3742bffb992a41a7a197a Author: Jose Antonio Ortega Ruiz Date: Tue Sep 7 00:22:37 2010 +0200 Support for evaluation warnings elisp/geiser-debug.el | 42 +++++++++++++++++++++++------------------- elisp/geiser-edit.el | 14 ++++++++++++++ elisp/geiser-guile.el | 12 +++++++++--- elisp/geiser-racket.el | 16 +++------------- elisp/geiser-syntax.el | 4 ++++ 5 files changed, 53 insertions(+), 35 deletions(-) commit d7805560c066359595e67d7edb60769861e1e2e6 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 6 21:13:12 2010 +0200 Guile: geiser-guile-jump-on-debug-p, geiser-guile-show-debug-help-p elisp/geiser-custom.el | 5 ++++- elisp/geiser-guile.el | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) commit c6acac244447cac2b4580658b40f3bde2425b8c4 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 6 07:26:54 2010 +0200 Allow loading byte-compiled Geiser without make install README | 14 +++++++++++--- configure.ac | 3 ++- doc/install.texi | 20 +++++++++++++++++--- elisp/Makefile.am | 8 +++++--- elisp/geiser-load.el.in | 8 ++++++++ elisp/geiser-reload.el | 14 +++++++------- elisp/geiser.el | 26 +++++++++++++------------- 7 files changed, 63 insertions(+), 30 deletions(-) create mode 100644 elisp/geiser-load.el.in commit 1891a799d793ac980be066a617b5ef542f431b52 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 6 04:45:28 2010 +0200 Bug fix: assign a default scheme to syntax hilighting buffer elisp/geiser-reload.el | 2 +- elisp/geiser-syntax.el | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) commit 43c915add421637b4db12941e6d738b8de46ff7b Author: Jose Antonio Ortega Ruiz Date: Mon Sep 6 01:50:24 2010 +0200 Autodoc: clean cache upon evaluation elisp/geiser-autodoc.el | 6 ++++-- elisp/geiser-compile.el | 7 +++++-- elisp/geiser-debug.el | 2 ++ elisp/geiser-reload.el | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) commit 6c5ab9fbb37f6691395ddcc8b985819b7809cac4 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 5 03:33:52 2010 +0200 Guile: fixes for compilation error regexps elisp/geiser-guile.el | 3 +-- elisp/geiser-repl.el | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) commit 8fa762ae053d6d2523e59f86c273f64cc421d8ad Author: Jose Antonio Ortega Ruiz Date: Sun Sep 5 02:32:57 2010 +0200 Guile: xref commands working again elisp/geiser-xref.el | 9 ++++----- scheme/guile/geiser/xref.scm | 13 ++++++------- 2 files changed, 10 insertions(+), 12 deletions(-) commit e1fbc2cf7fcd9a0bb77b1f9c0d8fe9d28102d6de Author: Jose Antonio Ortega Ruiz Date: Sun Sep 5 02:31:52 2010 +0200 Typo doc/repl.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 0628b1b2180896edbc0ab6b472860fc951cd5445 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 4 21:30:57 2010 +0200 Guile: better filtering of "anonymous" module names Temporary modules with fancy gensym names have kind #f. scheme/guile/geiser/modules.scm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) commit 2d6f9c093ab8f5c29204c7cd82ba53253a2e8348 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 4 21:21:04 2010 +0200 Documentation nit doc/repl.texi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit afa7fb40739992e22c7b4fd520ac6fac3d8e69c7 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 4 21:17:12 2010 +0200 REPL: (optionally) forget old errors on new expressions doc/geiser.texi | 16 ++++------------ doc/repl.texi | 27 +++++++++++++++++++++------ elisp/geiser-guile.el | 3 +++ elisp/geiser-repl.el | 13 +++++++++++++ 4 files changed, 41 insertions(+), 18 deletions(-) commit 35d7893f4889a7b4e67102b0da6363ed2454bc74 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 3 23:45:31 2010 +0200 Guile: don't create empty modules before loading them scheme/guile/geiser/modules.scm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) commit 8efeb0b047131e54550c919493b6f8b2680df29e Author: Jose Antonio Ortega Ruiz Date: Fri Sep 3 22:32:10 2010 +0200 Docs on scheme initialisation variables doc/repl.texi | 9 +++++++++ 1 file changed, 9 insertions(+) commit 73c8e10e31336b2d1232d833a96b45d1e21c2324 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 2 06:17:08 2010 +0200 Racket: better stack traces using errortrace elisp/geiser-racket.el | 9 +++++++++ scheme/racket/geiser.rkt | 2 ++ scheme/racket/geiser/eval.rkt | 26 +++++--------------------- 3 files changed, 16 insertions(+), 21 deletions(-) commit 4399176fae8187e5b896e0d28e4b888b8c39b5d1 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 2 06:15:58 2010 +0200 Yet another fix for scan locals (completion) elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 6108de2068c7badd28f2fa51c8ca3f2d2a7c3482 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 2 06:15:33 2010 +0200 Dead code elimination elisp/geiser-guile.el | 78 ++++++++++++++-------------------------------------- 1 file changed, 21 insertions(+), 57 deletions(-) commit 6fb4f86d76fe7138a549f32d794abc3b742bcecb Author: Jose Antonio Ortega Ruiz Date: Wed Sep 1 04:29:30 2010 +0200 Fix for C-c C-m (enter module) in REPL elisp/geiser-repl.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit abcb7b6737bbe925bd0597a4a526fabb02e95fe8 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 31 21:30:46 2010 +0200 Correctly deactivating autodoc when leaving geiser-mode elisp/geiser-mode.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit 97d7a64bd4ba60aaaaad4be801becdfa9330f873 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 31 21:26:05 2010 +0200 Make geiser-mode ask which scheme on activation if guessing fails elisp/geiser-impl.el | 4 ++-- elisp/geiser-mode.el | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit f6e8492346b1ac7be21b96849df25c08dd8ce3ae Author: Jose Antonio Ortega Ruiz Date: Tue Aug 31 16:43:35 2010 +0200 Guile: show error message upon entering the debugger elisp/geiser-guile.el | 14 ++++++++++++-- scheme/guile/geiser/emacs.scm | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) commit fb357359565a89c8e97db0c8068bad11579bb291 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 31 16:42:43 2010 +0200 Guile: fix for import module REPL command elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 3ad5e9e4b96e55e77832f5b9ecec827bfec47e45 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 31 16:41:45 2010 +0200 Fix for importing modules at the REPL elisp/geiser-repl.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit b09474daeb892ef0293342839a379e34d4d7c048 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 07:15:55 2010 +0200 Fix for locals scanning in presence of rest arguments. elisp/geiser-syntax.el | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) commit 627eef525aab39ba0895e120f0bca9be7fc10e6b Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 03:58:51 2010 +0200 Guile: display backtrace upon entering debugger. Inserting the banner is disabled for now: it confuses comint badly for reasons i don't understand yet. elisp/geiser-guile.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) commit 982bd4598eed2549ce1c2cd1f9bae3fa6cdf3e86 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 03:57:16 2010 +0200 Doc nit. doc/install.texi | 1 + 1 file changed, 1 insertion(+) commit 31c71af19fdd61f0eda2fd2d0a166d6fce4cb9c7 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 03:18:24 2010 +0200 Docs: index entries. README | 4 ++-- doc/fun.texi | 35 +++++++++++++++++++++++++++++++---- doc/install.texi | 4 ++-- doc/intro.texi | 1 + doc/repl.texi | 14 +++++++++++++- doc/top.texi | 1 + 6 files changed, 50 insertions(+), 9 deletions(-) commit bbdab87cde36468f0ecff05e8bdc39c443a91ca3 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 02:11:43 2010 +0200 Docs: first complete version of Fun between the parens. doc/fun.texi | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) commit b847d375e59662fc8fc88481d9a3a2e4bed3d088 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 01:54:44 2010 +0200 Docs: image updated. doc/img/eval-error.png | Bin 23930 -> 27374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) commit 00ba7dc2fabb5311677e6b1f0f7ed06bbea6864e Author: Jose Antonio Ortega Ruiz Date: Mon Aug 30 01:14:32 2010 +0200 More docs and a function renamed. doc/fun.texi | 20 ++++++++++++++------ doc/img/eval-error.png | Bin 0 -> 23930 bytes doc/img/geiser-mode.png | Bin 38574 -> 62445 bytes elisp/geiser-edit.el | 2 +- elisp/geiser-mode.el | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 doc/img/eval-error.png commit 6424ab0a38362e912192d74745e3c85b0a918cf0 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 29 14:50:38 2010 +0200 A bit more documentation. doc/fun.texi | 13 +++++++++++++ 1 file changed, 13 insertions(+) commit 96076cc456e769a2b54d92f5ab3d72fcb3fdf5fa Author: Jose Antonio Ortega Ruiz Date: Tue Aug 24 06:59:47 2010 +0200 Compilation commands removed from menu. elisp/geiser-mode.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit b44071cd31a77f18ac2daa5a6fe6a10cfa1384c8 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 24 06:59:19 2010 +0200 More documentation. doc/fun.texi | 140 +++++++++++++++++++++++++++++++++++--------------------- doc/geiser.texi | 35 ++++++++++++-- doc/install.texi | 6 +-- doc/intro.texi | 30 ++++++------ doc/macros.texi | 3 ++ doc/repl.texi | 75 +++++++++++++++--------------- 6 files changed, 178 insertions(+), 111 deletions(-) commit 7711c737109013110a706346903fd9c0a3e25660 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 21 00:37:39 2010 +0200 In texinfo, @var is for meta-variables, not regular ones doc/fun.texi | 20 ++++++++++---------- doc/repl.texi | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) commit 97510deb57f93c41256b6a28980919344d389008 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 21 00:35:14 2010 +0200 Ignoring auto4mate dir .gitignore | 1 + 1 file changed, 1 insertion(+) commit 7cae59669d3d90e2e2023f70a3d949e16256dbe7 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 21 00:25:18 2010 +0200 Bug fix: end-of-buffer in elisp code. elisp/geiser-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 1fb6db3a9a910836f221816c2b12c84495ebb8a1 Author: Jose Antonio Ortega Ruiz Date: Fri Aug 20 22:47:39 2010 +0200 Providing feedback while retrieving completion lists elisp/geiser-completion.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit a0784b20c60d4b5d32ec441dc8e56839bfe40f08 Author: Jose Antonio Ortega Ruiz Date: Thu Aug 19 07:54:58 2010 +0200 Redisplaying the prompt after empty lines on the REPL. elisp/geiser-repl.el | 21 ++++++++++++++++----- scheme/guile/geiser/emacs.scm | 4 +++- scheme/racket/geiser/main.rkt | 4 +++- 3 files changed, 22 insertions(+), 7 deletions(-) commit 4c25551e639bb19a60211d30e6c7adb2bc51c59e Author: Jose Antonio Ortega Ruiz Date: Sat Aug 14 21:48:10 2010 +0200 New restart repl command and a bit more docs. doc/fun.texi | 29 +++++++++++++++++++++++++++++ elisp/geiser-mode.el | 12 ++++++++++++ 2 files changed, 41 insertions(+) commit 739dde06bdd997995873fcd59f2c1cc1d2976aef Author: Jose Antonio Ortega Ruiz Date: Wed Aug 11 22:41:14 2010 +0200 More docs. doc/fun.texi | 50 ++++++++++++++++++++++++++++++++++++--------- doc/img/docstring.png | Bin 0 -> 16390 bytes doc/repl.texi | 1 + scheme/guile/geiser/doc.scm | 2 +- 4 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 doc/img/docstring.png commit ebec43db543a00efa13948f46fa30864844859fe Author: Jose Antonio Ortega Ruiz Date: Wed Aug 11 20:56:39 2010 +0200 Fixed bug in autodoc signature recognition. elisp/geiser-autodoc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 0b706d66773f1ee6222aa0f80520da3a3b6c4b04 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 7 03:05:26 2010 +0200 A bit more documentation. doc/fun.texi | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit 979fa6ea369cb0086593f9e3a4d46e003785a425 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 7 03:05:07 2010 +0200 geiser-font-lock-autodoc-procedure-name -> geiser-font-lock-autodoc-identifier elisp/geiser-autodoc.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) commit 188031e2c7c2971cb31f319d51b7cd465380f3a4 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 7 02:53:09 2010 +0200 Manual: autodoc description completed. doc/fun.texi | 34 +++++++++++++++++++++++++++++++++- doc/img/autodoc-multi.png | Bin 0 -> 15893 bytes doc/img/autodoc-var.png | Bin 0 -> 7931 bytes 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 doc/img/autodoc-multi.png create mode 100644 doc/img/autodoc-var.png commit 7ee06b0911ff7b3fedc0404c22883706a8d128f7 Author: Jose Antonio Ortega Ruiz Date: Sat Aug 7 02:52:11 2010 +0200 geiser-autodoc-procedure-name-format -> geiser-autodoc-identifier-format elisp/geiser-autodoc.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 265dba21bf1b9347749452304d40e030488ee2ca Author: Jose Antonio Ortega Ruiz Date: Fri Aug 6 21:19:26 2010 +0200 Guile: better formatting of autodoc's variable values. scheme/guile/geiser/doc.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 0b5791b3c64a0a704948f99965c17418652fbdcd Author: Jose Antonio Ortega Ruiz Date: Fri Aug 6 21:00:32 2010 +0200 Nit. elisp/geiser-mode.el | 2 +- elisp/geiser-repl.el | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit 8e3660b42835a04ff6d3a5440db81da2b769444e Author: Jose Antonio Ortega Ruiz Date: Fri Aug 6 20:25:23 2010 +0200 Bug fix: menu code was obliterating the buffer's associated.repl. elisp/geiser-menu.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 94f40872f82fa08d780630ec492d5a4ef4875134 Author: Jose Antonio Ortega Ruiz Date: Fri Aug 6 19:15:35 2010 +0200 Keybinding changes documented. doc/fun.texi | 52 ++++++++++++++++++++++++++------------------------- doc/img/repl-menu.png | Bin 28491 -> 29590 bytes doc/repl.texi | 27 +++++++++++++------------- elisp/geiser-mode.el | 1 - elisp/geiser-repl.el | 19 +++++++++---------- 5 files changed, 50 insertions(+), 49 deletions(-) commit 3572a10cc7e9328f491ca20d95e05ae0e377e218 Author: Jose Antonio Ortega Ruiz Date: Fri Aug 6 18:04:58 2010 +0200 Removing key bindings of the form C-c . These are reserved for users. See http://www.gnu.org/software/emacs/elisp/html_node/Key-Binding-Conventions.htm README | 39 ++++++++++++++++++++------------------- elisp/geiser-repl.el | 10 +++++----- 2 files changed, 25 insertions(+), 24 deletions(-) commit 654bfbff2675c45882857411c7a2f3594e708639 Author: Jose Antonio Ortega Ruiz Date: Sat Jul 31 14:04:42 2010 +0200 Making geiser-scheme-implementation work as advertised. elisp/geiser-impl.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) commit 47361c31fe721073b3e3a9c16eaa10ef39c805de Author: Jose Antonio Ortega Ruiz Date: Sat Jul 31 03:52:08 2010 +0200 Fix for the fix. elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit ab7effca73f21c9e5c2f8d94c132b046978bf6ca Author: Jose Antonio Ortega Ruiz Date: Sat Jul 31 03:11:32 2010 +0200 Autodoc: fix for current argument hihglighting. elisp/geiser-syntax.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit ec3d0d43201f101f738b92eb1827c69641a76dde Author: Jose Antonio Ortega Ruiz Date: Wed Jul 28 01:09:00 2010 +0200 A bit more documentation. doc/fun.texi | 32 +++++++++++++++++++++++++++++++- doc/img/autodoc-req.png | Bin 0 -> 10002 bytes 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 doc/img/autodoc-req.png commit 32f9cb274bc9abc16449d2da50df537c82cc7775 Author: Jose Antonio Ortega Ruiz Date: Wed Jul 28 01:08:25 2010 +0200 Displaying variable values in autodoc. elisp/geiser-autodoc.el | 7 ++++++- elisp/geiser-syntax.el | 31 ++++++++++++++----------------- scheme/guile/geiser/doc.scm | 7 +++++-- scheme/racket/geiser/autodoc.rkt | 9 ++++++--- 4 files changed, 31 insertions(+), 23 deletions(-) commit 235543503d09a52a513054ed75ac2506b7ce87bf Author: Jose Antonio Ortega Ruiz Date: Sun Jul 25 23:43:50 2010 +0200 C-c z as a to and fro jump, plus documentation. README | 2 +- doc/fun.texi | 25 +++++++++++++++++++++---- doc/repl.texi | 4 +++- elisp/geiser-debug.el | 2 +- elisp/geiser-doc.el | 6 +++++- elisp/geiser-mode.el | 7 ++++--- elisp/geiser-repl.el | 26 +++++++++++++++++--------- 7 files changed, 52 insertions(+), 20 deletions(-) commit 941d65165b3bce917d3bff9952e582800ccf2981 Author: Jose Antonio Ortega Ruiz Date: Sun Jul 25 22:35:41 2010 +0200 Tweaks to scheme implementation selection, and docs for it. doc/fun.texi | 105 ++++++++++++++++++++++++++++++++++++++++++++++++-- doc/repl.texi | 1 + elisp/geiser-guile.el | 2 + elisp/geiser-impl.el | 14 +++---- elisp/geiser-racket.el | 10 ++--- 5 files changed, 115 insertions(+), 17 deletions(-) commit d2f2b41c0926ae538ce4acc190150f49e56bc9d5 Author: Jose Antonio Ortega Ruiz Date: Sun Jul 25 16:19:00 2010 +0200 Manual: first section on Scheme buffers. doc/fun.texi | 88 ++++++++++++++++++++++++++++++++++++++++++++++--- doc/img/geiser-mode.png | Bin 0 -> 38574 bytes doc/install.texi | 1 + 3 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 doc/img/geiser-mode.png commit 151eb1884a075479e6aa4bc91982661730375d46 Author: Jose Antonio Ortega Ruiz Date: Sat Jul 24 22:00:43 2010 +0200 Racket: catching errors during contract retrieval. scheme/racket/geiser/modules.rkt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 0fcf4491f889e24853d6b6643b773d0b4e5e7346 Author: Jose Antonio Ortega Ruiz Date: Sat Jul 24 01:30:09 2010 +0200 Truncating lines in documentation browser. elisp/geiser-doc.el | 1 + scheme/racket/geiser/modules.rkt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) commit d2cb7333992ba6c523814f1de8e714e345a50475 Author: Jose Antonio Ortega Ruiz Date: Sat Jul 24 01:12:26 2010 +0200 Racket: showing contracts in module documentation. elisp/geiser-doc.el | 13 ++++++++----- scheme/racket/geiser/modules.rkt | 20 +++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) commit 6d5280bde548ea2df907b716ac51bb2de5a602f7 Author: Jose Antonio Ortega Ruiz Date: Sat Jul 24 00:27:12 2010 +0200 A new image for the manual. doc/img/repl-mod.png | Bin 15190 -> 13151 bytes 1 file changed, 0 insertions(+), 0 deletions(-) commit 83302275cd1250826833773f2e04b2b88046aad3 Author: Jose Antonio Ortega Ruiz Date: Thu Jul 22 00:50:59 2010 +0200 Guile: bug fix in macro's autodoc. scheme/guile/geiser/doc.scm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) commit 1fef55a87f0b10945b185d80f5282fc5fd82997e Author: Jose Antonio Ortega Ruiz Date: Tue Jul 20 22:20:16 2010 +0200 Guile: geiser commands working at the debugging prompt. elisp/geiser-connection.el | 24 +++++++++++++++++++++--- elisp/geiser-guile.el | 6 +++++- elisp/geiser-repl.el | 14 ++++++++++++-- 3 files changed, 38 insertions(+), 6 deletions(-) commit d0ac61ce118cd8a5a49bf6515d17387bbe258357 Author: Jose Antonio Ortega Ruiz Date: Tue Jul 20 00:46:46 2010 +0200 Doc nits. doc/repl.texi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) commit dbc66666f5374165b5cf4980af11d9647b15a755 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 19 22:26:14 2010 +0200 REPL: new doc bindings in tune with those in scheme buffers. README | 3 ++- doc/img/repl-menu.png | Bin 145164 -> 28491 bytes doc/repl.texi | 9 ++++++++- doc/web.texi | 1 + elisp/geiser-repl.el | 7 +++++-- 5 files changed, 16 insertions(+), 4 deletions(-) commit 8c0e353f4ba51d25aa8c823f3e6d8ac4ff1b4779 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 19 21:46:27 2010 +0200 Guile: taking advantage of the patterns property in macro transformers. scheme/guile/geiser/doc.scm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) commit a6df381f547b61ccfb3c572246eb92d5b0839900 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 19 21:45:32 2010 +0200 Guile: restoring (minimal) support for debugging REPL. elisp/geiser-guile.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 61bf896d30078dcc5f0862e2198db250efb4336c Author: Jose Antonio Ortega Ruiz Date: Thu Jul 8 20:43:11 2010 +0200 Avoiding old-style backquotes during compilation of geiser-popup.el. elisp/geiser-popup.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) commit 7a854d62eaebd9cf7173fefd838a4cbb7601701a Author: Jose Antonio Ortega Ruiz Date: Mon Jul 5 02:14:41 2010 +0200 Racket: indentation for typed binding forms. elisp/geiser-racket.el | 8 ++++++-- elisp/geiser-syntax.el | 11 +++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) commit 660eb5296bbc16776f7dd3b39f78e88567ed95d0 Author: Jose Antonio Ortega Ruiz Date: Mon Jul 5 00:20:03 2010 +0200 Racket: following error links in separate window. elisp/geiser-edit.el | 8 +++++--- elisp/geiser-racket.el | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) commit 8c8d54bf948f88ec2fcf5b1071736884087564d1 Author: Jose Antonio Ortega Ruiz Date: Sun Jul 4 22:23:24 2010 +0200 Racket: serious bug preventing file compilation fixed. scheme/racket/geiser/eval.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 6eccf7716be251d9c5fb4e2457ae77f278af19f1 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 29 15:25:02 2010 +0200 Web pages sync'd doc/Makefile.am | 11 +++++++++-- doc/fun.texi | 12 ++++++++++++ doc/geiser.texi | 6 ++++++ doc/index.texi | 2 +- doc/repl.texi | 2 +- doc/web.texi | 2 ++ 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 doc/fun.texi commit 31b0547f7a37272c3a9bc111d6954e9859ed69ab Author: Jose Antonio Ortega Ruiz Date: Tue Jun 29 14:51:46 2010 +0200 Docs: REPL tutorial completed doc/geiser.css | 6 +++- doc/geiser.texi | 4 +++ doc/img/repl-mod.png | Bin 0 -> 15190 bytes doc/repl.texi | 81 ++++++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 doc/img/repl-mod.png commit 2f20ae673e1e7b5806270f1ee02b647eb934e5b6 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 28 02:34:11 2010 +0200 Progress in the REPL tutorial. doc/img/mod-completion.png | Bin 0 -> 30962 bytes doc/img/repl-autodoc.png | Bin 0 -> 54293 bytes doc/img/repl-menu.png | Bin 147379 -> 145164 bytes doc/intro.texi | 1 + doc/repl.texi | 138 +++++++++++++++++++++++++++++++++++++--------- 5 files changed, 114 insertions(+), 25 deletions(-) create mode 100644 doc/img/mod-completion.png create mode 100644 doc/img/repl-autodoc.png commit c717a7ef993b800b6c02aa914b3cee8921142f5d Author: Jose Antonio Ortega Ruiz Date: Mon Jun 28 02:01:02 2010 +0200 REPL: fix for M-. binding elisp/geiser-repl.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) commit 3d5e00a5108287d238dbadf398337834864b5f43 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 27 16:55:00 2010 +0200 Some REPL tweaks. elisp/geiser-repl.el | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) commit 9ef09ff72b8c8a015b38a30334b00cb4cea15158 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 27 14:44:16 2010 +0200 Better switch/import REPL commands. elisp/geiser-guile.el | 13 ++++++++++++- elisp/geiser-racket.el | 11 ++++++++++- elisp/geiser-repl.el | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) commit eab369930516ece1d40658b891f4629d6f9ed8ac Author: Jose Antonio Ortega Ruiz Date: Sun Jun 27 01:43:32 2010 +0200 A new tutorial bit doc/Makefile.am | 1 + doc/geiser.css | 17 +++++++++-- doc/geiser.texi | 16 ++++++++-- doc/img/repl-menu.png | Bin 0 -> 147379 bytes doc/img/repls.png | Bin 0 -> 154876 bytes doc/index.texi | 2 +- doc/install.texi | 2 +- doc/intro.texi | 2 +- doc/macros.texi | 12 ++++++++ doc/repl.texi | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ doc/top.texi | 9 ------ doc/tutorial.texi | 12 -------- doc/web.texi | 9 ++++-- 13 files changed, 136 insertions(+), 31 deletions(-) create mode 100644 doc/img/repl-menu.png create mode 100644 doc/img/repls.png create mode 100644 doc/macros.texi create mode 100644 doc/repl.texi delete mode 100644 doc/tutorial.texi commit 58ab7aec6417e4410c0b5f886b16c8f49168fa7c Author: Jose Antonio Ortega Ruiz Date: Sat Jun 26 16:45:32 2010 +0200 Separate main texi file for web site. doc/Makefile.am | 4 ++-- doc/geiser.texi | 43 +------------------------------------------ doc/top.texi | 31 +++++++++++++++++++++++++++++++ doc/web.texi | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 44 deletions(-) create mode 100644 doc/top.texi create mode 100644 doc/web.texi commit 878f478f5a4b1d9e598d9caa425ee56ad3afb6ab Author: Jose Antonio Ortega Ruiz Date: Wed Jun 23 23:04:58 2010 +0200 REPL: quit command. README | 3 ++- elisp/geiser-repl.el | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) commit 6f92b8d92be72a5cc54f7ccb5ed9cef15de33296 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 23 22:54:13 2010 +0200 REPL: change current module command and better bindings. elisp/geiser-completion.el | 3 ++- elisp/geiser-mode.el | 3 ++- elisp/geiser-repl.el | 69 +++++++++++++++++++++++++---------------------- 3 files changed, 41 insertions(+), 34 deletions(-) commit 2b47a45e126d8fb4457512d6aee0e829a0c6b07f Author: Jose Antonio Ortega Ruiz Date: Wed Jun 23 22:52:32 2010 +0200 Documentation tweaks README | 8 ++++---- doc/geiser.css | 4 ++++ doc/geiser.texi | 2 ++ doc/index.texi | 2 +- doc/install.texi | 8 +++++++- doc/intro.texi | 5 +++-- doc/tutorial.texi | 4 +++- 7 files changed, 24 insertions(+), 9 deletions(-) commit b14b2114bbce42fd282648a7adc44a87ca42d4de Author: Jose Antonio Ortega Ruiz Date: Tue Jun 22 01:49:19 2010 +0200 Unneeded file wiped out. doc/make-site.sh | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100755 doc/make-site.sh commit e27e9961e58925e39cd5a19699806aac640abbd1 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 22 01:47:58 2010 +0200 Engaging texi files in some autotooling. .gitignore | 3 +++ Makefile.am | 2 +- configure.ac | 4 ++-- doc/Makefile.am | 30 ++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 doc/Makefile.am commit 348fdbe00a7cb3d4bc3729fe032f36921715ce70 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 22 01:09:22 2010 +0200 Missing file. doc/tutorial.texi | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/tutorial.texi commit b0bc376b371bd6d907a2c42248bc2b928c32d333 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 22 01:06:58 2010 +0200 Documentation tweaks. doc/geiser.css | 17 ++++++++++++++++- doc/geiser.texi | 40 +++++++++++++++++++--------------------- doc/index.texi | 2 +- doc/install.texi | 8 ++++---- doc/intro.texi | 2 +- doc/quick.texi | 10 ---------- doc/site.conf | 7 +++---- 7 files changed, 44 insertions(+), 42 deletions(-) delete mode 100644 doc/quick.texi commit 7812150d033cf58036d0b5cea0ca59581681fb17 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 21 00:02:34 2010 +0200 Mentioning Quack in the docs. doc/geiser.texi | 7 +++++-- doc/install.texi | 58 +++++++++++++++++++++++++++++++-------------------------- 2 files changed, 37 insertions(+), 28 deletions(-) commit 25a39cf39fa1b29636111d03ba35cd4862fcba8d Author: Jose Antonio Ortega Ruiz Date: Sun Jun 20 21:52:52 2010 +0200 Scripts for generating Geiser's website. doc/geiser.css | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/geiser.texi | 46 +++++++++++++++++++++++++++++---------- doc/install.texi | 67 ++++++++++++++++++++++----------------------------------- doc/intro.texi | 24 +-------------------- doc/make-site.sh | 15 +++++++++++++ doc/site.conf | 53 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 195 insertions(+), 75 deletions(-) create mode 100644 doc/geiser.css create mode 100755 doc/make-site.sh create mode 100644 doc/site.conf commit 2170808fe933eef91dc374a76d3a56fa57747634 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 20 04:35:58 2010 +0200 Tweaks to the manual. .gitignore | 1 + doc/fdl.texi | 519 -------------------------------------------------------- doc/geiser.texi | 14 +- doc/index.texi | 2 +- doc/install.texi | 2 +- doc/quick.texi | 2 +- 6 files changed, 8 insertions(+), 532 deletions(-) delete mode 100644 doc/fdl.texi commit 871b4082904fe087c6616570e496092717e000d1 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 20 03:27:25 2010 +0200 Manual: installation section. doc/geiser.texi | 3 +- doc/install.texi | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++------ doc/intro.texi | 2 +- doc/quick.texi | 2 ++ 4 files changed, 103 insertions(+), 12 deletions(-) commit 7cfa18914d1ccb85aca33f659c931be0e8a8c894 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 19 23:35:21 2010 +0200 The humble beginnings of a user's manual. .gitignore | 12 ++ README | 2 +- doc/fdl.texi | 519 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/geiser.texi | 94 ++++++++++ doc/index.texi | 14 ++ doc/install.texi | 50 ++++++ doc/intro.texi | 111 ++++++++++++ doc/quick.texi | 8 + 8 files changed, 809 insertions(+), 1 deletion(-) create mode 100644 doc/fdl.texi create mode 100644 doc/geiser.texi create mode 100644 doc/index.texi create mode 100644 doc/install.texi create mode 100644 doc/intro.texi create mode 100644 doc/quick.texi commit 975831b323afa7ae11a7b960f337faf2a4fd5f10 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 19 16:32:16 2010 +0200 Guile: no need to de-mangling autodoc args anymore. scheme/guile/geiser/doc.scm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) commit f7b672621bc80c93c3788bc99ce850f4edc50aaa Author: Jose Antonio Ortega Ruiz Date: Fri Jun 18 13:40:54 2010 +0200 Guile: filtering gensym names in autodoc display. scheme/guile/geiser/doc.scm | 24 +++++++++++------------- scheme/guile/geiser/modules.scm | 14 +++++++------- scheme/guile/geiser/utils.scm | 12 ++++++++++-- 3 files changed, 28 insertions(+), 22 deletions(-) commit ce3ef41414442b345e5e8d9f064f0d7531addea5 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 17 03:29:34 2010 +0200 Catching abnormal exits of the inferior scheme process. elisp/geiser-repl.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) commit 99355e34b3e4eeb667692f8d3ae559e672ed45c7 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 17 02:49:19 2010 +0200 Wee refactoring. scheme/racket/geiser/autodoc.rkt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) commit a4ae1d6901d397ad740141dddbd9144c04681586 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 17 02:34:14 2010 +0200 Racket: using `_' for naming unknown args in autodoc. scheme/racket/geiser/autodoc.rkt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) commit 7166e8e55900d1c3d7c45692c6121fb8a0920e16 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 17 02:10:09 2010 +0200 Golfing. scheme/guile/geiser/modules.scm | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) commit 4bbe14d551f06608a9df68b4270c5d8b3fc3eb97 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 16 23:05:16 2010 +0200 Guile: excluding anonymous module names from completion. scheme/guile/geiser/modules.scm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) commit 64ba8a37a52e1b07605915931825de399cb5646a Author: Jose Antonio Ortega Ruiz Date: Tue Jun 15 03:19:03 2010 +0200 Menu for debug buffer. elisp/geiser-debug.el | 11 +++++++++++ 1 file changed, 11 insertions(+) commit 50669ab30243002035b9637c05b51e6b95397335 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 15 02:35:51 2010 +0200 Hiding the obsolete scheme menu in geiser-mode buffers. elisp/geiser-mode.el | 2 ++ 1 file changed, 2 insertions(+) commit 8b399bd98609c275ccf961c2761ba1f33012353c Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 23:54:51 2010 +0200 Menus for geiser-mode. elisp/geiser-doc.el | 4 +-- elisp/geiser-menu.el | 6 ++-- elisp/geiser-mode.el | 93 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 57 insertions(+), 46 deletions(-) commit 3114e4208dd63bde3f978cae581503a70217db63 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 22:31:13 2010 +0200 Better keybindings for documentation browser README | 26 ++++++++++++-------------- elisp/geiser-doc.el | 21 ++++++++++++++------- elisp/geiser-popup.el | 3 +-- 3 files changed, 27 insertions(+), 23 deletions(-) commit 6d36cce3a51d6ebc779d1082b32402001fa9d796 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 22:01:41 2010 +0200 Popups improvements (excluding view mode's keymap). elisp/geiser-popup.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) commit c98d51d7a6cce6d7d64c1893f5ece70ed83841f9 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 20:29:14 2010 +0200 Refactoring. elisp/geiser-impl.el | 3 ++ elisp/geiser-menu.el | 120 ++++++++++++++++++++++++---------------------------- 2 files changed, 58 insertions(+), 65 deletions(-) commit 8cbee770fd943323297de29f6ae11541a2b63a0b Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 04:35:48 2010 +0200 Nits. elisp/geiser-doc.el | 4 ++-- elisp/geiser-menu.el | 14 +++++++------- elisp/geiser-repl.el | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) commit d92baad9f8e9f205ca1dc642e7f763ddbcfec43b Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 04:17:54 2010 +0200 Better menus. elisp/geiser-doc.el | 10 ++--- elisp/geiser-menu.el | 127 +++++++++++++++++++++++----------------------------- elisp/geiser-repl.el | 21 ++++----- 3 files changed, 72 insertions(+), 86 deletions(-) commit 61a0065711cde95ed7a20f183e871b4628a415b4 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 01:37:02 2010 +0200 New elisp file (geiser-menu) added to Makefile.am. elisp/Makefile.am | 1 + 1 file changed, 1 insertion(+) commit 47e2bf1d186507a217d23f57532610bce0da824e Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 01:01:09 2010 +0200 REPL menu. elisp/geiser-repl.el | 56 ++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 26 deletions(-) commit caae0709112c75d7cac72b5e2249b01cbea3d46c Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 01:00:51 2010 +0200 Support for minor mode toggling in menus. elisp/geiser-menu.el | 11 +++++++++++ 1 file changed, 11 insertions(+) commit e55009c09f5bcfd24fb00a31a2f9570f5c191689 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 00:36:05 2010 +0200 Menu for documentation browser. elisp/geiser-doc.el | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) commit a029a01b9b451647f206be50fd4cdf67bac9e38d Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 00:33:41 2010 +0200 Generic support for menus. elisp/geiser-impl.el | 2 + elisp/geiser-menu.el | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-reload.el | 1 + 3 files changed, 160 insertions(+) create mode 100644 elisp/geiser-menu.el commit 2daad50e9f20fd815ea3ac81786dc675b3b59a8d Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 00:32:42 2010 +0200 Half-baked code deactivated for now. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 85de1f30777b90e79639b170fbc069e79aa608c2 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 14 00:32:08 2010 +0200 Dead code elimination. elisp/geiser-r6rs.el | 50 -------------------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 elisp/geiser-r6rs.el commit 25ed49cddef2977a6620b3f7ec8a2a8a972ef3f2 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 12 00:14:27 2010 +0200 Fix for popups: don't deactivate view-mode on exit. elisp/geiser-popup.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) commit 1d50e765c1b8aad497973d55a7543c746e348e8f Author: Jose Antonio Ortega Ruiz Date: Sat Jun 12 00:07:53 2010 +0200 Nit. elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 31df91e17edf9e8eea742b5a6f674a20868ec827 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 12 00:03:28 2010 +0200 New buttons (source, forward/backward) in document browser. elisp/geiser-doc.el | 101 +++++++++++++++++++++++++++++++++++++++----------- elisp/geiser-edit.el | 5 ++- elisp/geiser-reload.el | 4 +- elisp/geiser-syntax.el | 32 ++++++++-------- 4 files changed, 102 insertions(+), 40 deletions(-) commit 4428e92f1ea97ac1443740c97e0ad8db6d0259fa Author: Jose Antonio Ortega Ruiz Date: Fri Jun 11 20:00:35 2010 +0200 Fixes for module navigation in doc browser. elisp/geiser-doc.el | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) commit 78a281ecfed5dd848929813d4aa1c7c0de209fbb Author: Jose Antonio Ortega Ruiz Date: Fri Jun 11 20:00:02 2010 +0200 Guile: tweaks to the previous fix. scheme/guile/geiser/modules.scm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) commit a182ebe9a51ecb902103d038b4b217ded959a025 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 11 18:18:10 2010 +0200 Guile: showing again submodules in module documentation. scheme/guile/geiser/modules.scm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) commit 9ff0ba8e1fb1b990c6f5e17f7ccb69101d96d4a6 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 11 13:52:51 2010 +0200 Guile: fix for module name completion. scheme/guile/geiser/modules.scm | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) commit 651f43777efde955f63f8e0818a626143fb75736 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 10 03:27:22 2010 +0200 Racket: improvements in module lookups. - We now correctly register submodules and handle main files. - We contemplate the possibility that a module is accessed using different paths. scheme/racket/geiser/enter.rkt | 48 ++++++++++++++++++++++++++++++++++++----- scheme/racket/geiser/modules.rkt | 47 ++++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 29 deletions(-) commit 61cb8d659399a942fa74947749b3a23a88bda04f Author: Jose Antonio Ortega Ruiz Date: Wed Jun 9 00:41:22 2010 +0200 Racket: improvements in non-loaded module location. scheme/racket/geiser/modules.rkt | 42 ++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) commit e9b0f1aaa810c15dbdffc4147f2956851c4f1782 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 8 02:11:55 2010 +0200 Racket: square cosmetics. scheme/racket/geiser/autodoc.rkt | 154 +++++++++++++++++++------------------- scheme/racket/geiser/enter.rkt | 4 +- scheme/racket/geiser/eval.rkt | 16 ++-- scheme/racket/geiser/locations.rkt | 10 +-- scheme/racket/geiser/modules.rkt | 68 ++++++++--------- scheme/racket/geiser/utils.rkt | 8 +- 6 files changed, 130 insertions(+), 130 deletions(-) commit d402ed3f41790abb9861af9dbe47166295cd66b1 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 8 01:42:04 2010 +0200 Racket: autodoc for struct constructors scheme/racket/geiser/autodoc.rkt | 25 ++++++++++++++----------- scheme/racket/geiser/enter.rkt | 18 +++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) commit 616c53c6e12ff227e3fbff782f4d7f8be120aa5c Author: Jose Antonio Ortega Ruiz Date: Tue Jun 8 01:02:58 2010 +0200 Racket: fix for kwargs display. scheme/racket/geiser/autodoc.rkt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit 62cb11d150a99d0284f783259449dc60c0dc0adc Author: Jose Antonio Ortega Ruiz Date: Tue Jun 8 00:08:38 2010 +0200 Guile: small tweak. elisp/geiser-guile.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit a38d34a8735bcc28d1c01f4128ab299b88ed7b58 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 03:35:33 2010 +0200 Guile: displaying the debugger preamble. elisp/geiser-guile.el | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) commit 2fb9578e1ae6edfd2dbd4a90a44ac6b0aef55d6b Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 03:34:57 2010 +0200 Guile: no more module loading under the rug. scheme/guile/geiser/modules.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e00cf1fd0a98d168a71c9eff1fe086a1e664680a Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 02:26:44 2010 +0200 Oops, it wasn't dead. elisp/geiser-guile.el | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) commit f0db115f00abb485c0197de931aa4f233d764e5f Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 02:21:06 2010 +0200 Guile: dead elisp code elimination. elisp/geiser-guile.el | 44 +------------------------------------------- scheme/guile/geiser/xref.scm | 2 +- 2 files changed, 2 insertions(+), 44 deletions(-) commit f669d52cfa944865f0b1f340dc0a7e634fec8e99 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 01:33:55 2010 +0200 README: note about Guile version. README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 17b23aa1bfe807c68ddc5ff01eaccc99fd02a058 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 7 01:25:14 2010 +0200 Guile: real fix for symbol locations (needs Guile's git head). scheme/guile/geiser/evaluation.scm | 8 +------- scheme/guile/geiser/modules.scm | 23 ++++++++++++++++++++--- scheme/guile/geiser/xref.scm | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) commit 95f39e30fd4ae59cf962648dc8c0120c654c05bd Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 21:33:21 2010 +0200 Elisp: missing require. elisp/geiser-popup.el | 2 ++ 1 file changed, 2 insertions(+) commit 7265c941f5b09f9a4c4eb4d70a361ead4bbb2b3e Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 21:14:54 2010 +0200 Elisp: better fix for previous bug. elisp/geiser-autodoc.el | 8 ++------ elisp/geiser-syntax.el | 12 +++--------- 2 files changed, 5 insertions(+), 15 deletions(-) commit 1ed3aca4b58fe3cf51d5a91e2bf4371f38d17122 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 20:20:57 2010 +0200 Elisp: fixes for key args display. elisp/geiser-autodoc.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) commit 9630e161959a39d35534cb19089a3c6581bdadd8 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 19:28:36 2010 +0200 Guile: new evaluation strategy that really delimits stack frames. scheme/guile/geiser/evaluation.scm | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) commit d8aad434a66e5656b583d17a139da20ca52c3321 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 18:22:44 2010 +0200 Guile: fix for finding locations of symbols in modules outside load path. scheme/guile/geiser/evaluation.scm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit b5941ceec4fc06e3cdac0098ada3a561c476d627 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 18:16:08 2010 +0200 Guile: fix for macroexpand. scheme/guile/geiser/evaluation.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 48b25de81bb81ab479f3b71536ad056fe322d5a3 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 14:14:56 2010 +0200 Guile: better stack trace limits during evaluation. scheme/guile/geiser/evaluation.scm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit fb189e4530f93138f25546d5633e9703c04f932b Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 06:12:14 2010 +0200 Debugging leftover. elisp/geiser-guile.el | 1 - 1 file changed, 1 deletion(-) commit a9f26a5234473af5e5d577b1855793f5e2ed2faa Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 06:01:27 2010 +0200 Guile: fixes for error navigation. elisp/geiser-guile.el | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) commit f911e89822474bb57152ba6db861f1bd6be00460 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 05:36:43 2010 +0200 Guile: evaluation fixes (current git head). scheme/guile/geiser/evaluation.scm | 6 ++++-- scheme/guile/geiser/modules.scm | 5 +++-- scheme/guile/geiser/xref.scm | 6 ++++-- 3 files changed, 11 insertions(+), 6 deletions(-) commit 4d8117a2e9b6dd3b969e84b72c8fbbfcd4e87c21 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 03:59:47 2010 +0200 Adding define-syntax-rule to heuristics for locating definitions. elisp/geiser-edit.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 9961210627268ec740998f8a7cdb942c6b7cdc23 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 03:59:03 2010 +0200 Conflicts between view-mode and geiser-doc-mode keymaps removed. README | 10 +++++----- elisp/geiser-doc.el | 13 +++++-------- elisp/geiser-popup.el | 7 ++++--- 3 files changed, 14 insertions(+), 16 deletions(-) commit 8f42520501ade7643aa517b2c5aa2456ac992f02 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 03:58:01 2010 +0200 Avoiding duplicates in autodoc arg lists elisp/geiser-autodoc.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit d286490c5a7fbe0554ff946b712c1f5308f38f95 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 00:41:45 2010 +0200 Reusing emacs view-mode for pop-up windows. elisp/geiser-popup.el | 49 ++++++++----------------------------------------- 1 file changed, 8 insertions(+), 41 deletions(-) commit c133d5c569e53edc0ccf89c783be668061902c02 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 6 00:41:07 2010 +0200 Whitespace. elisp/geiser-debug.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 098070ce89f21d692261fe49d07319ee1d7fdd66 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 5 23:55:14 2010 +0200 Racket: providing error contexts elisp/geiser-debug.el | 2 +- scheme/racket/geiser/eval.rkt | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) commit fe69f305ea550c9822f280e574ba3d80dd3e3d0a Author: Jose Antonio Ortega Ruiz Date: Sat Jun 5 21:26:41 2010 +0200 Better signature parsing (improper arg lists). elisp/geiser-autodoc.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) commit 222f125204291dfc93cb9b0de1270bf86b141a56 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 5 20:40:28 2010 +0200 Bug in scheme reader fixed elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit b0b8e2fd310e97689a3f90781f26b6ae8129e025 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 5 17:18:40 2010 +0200 Racket: off-by-one bug in module name completions scheme/racket/geiser/modules.rkt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit 99285f865b352ce0658cca3cd4845995af4ea71d Author: Jose Antonio Ortega Ruiz Date: Sat Jun 5 15:26:37 2010 +0200 Racket: better autodoc for syntax forms elisp/geiser-completion.el | 3 ++- scheme/racket/geiser/autodoc.rkt | 11 +++++++++-- scheme/racket/geiser/enter.rkt | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-) commit f0ff37dc07075298043a8b5319867d355f41a773 Author: Jose Antonio Ortega Ruiz Date: Mon May 24 05:00:58 2010 +0200 Elisp: misc little bugs (revealed by the byte compiler) fixed. elisp/geiser-completion.el | 7 ++++--- elisp/geiser-racket.el | 2 +- elisp/geiser-repl.el | 2 +- elisp/geiser-syntax.el | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) commit 185abd5871b99d3642ee43db0d8590e54d66f898 Author: Jose Antonio Ortega Ruiz Date: Mon May 24 04:59:54 2010 +0200 Elisp: compilation fixed. elisp/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 2d30daecad657d692a7f3cb66deb496630362600 Author: Jose Antonio Ortega Ruiz Date: Mon May 24 00:03:30 2010 +0200 Racket: PLT implementation renamed to Racket. elisp/geiser-impl.el | 2 +- elisp/geiser-plt.el | 208 ----------------------------------- elisp/geiser-racket.el | 209 ++++++++++++++++++++++++++++++++++++ elisp/geiser.el | 10 +- scheme/Makefile.am | 20 ++-- scheme/plt/geiser.rkt | 22 ---- scheme/plt/geiser/autodoc.rkt | 189 -------------------------------- scheme/plt/geiser/completions.rkt | 31 ------ scheme/plt/geiser/enter.rkt | 103 ------------------ scheme/plt/geiser/eval.rkt | 81 -------------- scheme/plt/geiser/locations.rkt | 54 ---------- scheme/plt/geiser/main.rkt | 47 -------- scheme/plt/geiser/modules.rkt | 150 -------------------------- scheme/plt/geiser/user.rkt | 57 ---------- scheme/plt/geiser/utils.rkt | 27 ----- scheme/racket/geiser.rkt | 22 ++++ scheme/racket/geiser/autodoc.rkt | 189 ++++++++++++++++++++++++++++++++ scheme/racket/geiser/completions.rkt | 31 ++++++ scheme/racket/geiser/enter.rkt | 103 ++++++++++++++++++ scheme/racket/geiser/eval.rkt | 81 ++++++++++++++ scheme/racket/geiser/locations.rkt | 54 ++++++++++ scheme/racket/geiser/main.rkt | 47 ++++++++ scheme/racket/geiser/modules.rkt | 150 ++++++++++++++++++++++++++ scheme/racket/geiser/user.rkt | 56 ++++++++++ scheme/racket/geiser/utils.rkt | 27 +++++ 25 files changed, 985 insertions(+), 985 deletions(-) delete mode 100644 elisp/geiser-plt.el create mode 100644 elisp/geiser-racket.el delete mode 100644 scheme/plt/geiser.rkt delete mode 100644 scheme/plt/geiser/autodoc.rkt delete mode 100644 scheme/plt/geiser/completions.rkt delete mode 100644 scheme/plt/geiser/enter.rkt delete mode 100644 scheme/plt/geiser/eval.rkt delete mode 100644 scheme/plt/geiser/locations.rkt delete mode 100644 scheme/plt/geiser/main.rkt delete mode 100644 scheme/plt/geiser/modules.rkt delete mode 100644 scheme/plt/geiser/user.rkt delete mode 100644 scheme/plt/geiser/utils.rkt create mode 100644 scheme/racket/geiser.rkt create mode 100644 scheme/racket/geiser/autodoc.rkt create mode 100644 scheme/racket/geiser/completions.rkt create mode 100644 scheme/racket/geiser/enter.rkt create mode 100644 scheme/racket/geiser/eval.rkt create mode 100644 scheme/racket/geiser/locations.rkt create mode 100644 scheme/racket/geiser/main.rkt create mode 100644 scheme/racket/geiser/modules.rkt create mode 100644 scheme/racket/geiser/user.rkt create mode 100644 scheme/racket/geiser/utils.rkt commit 0b491101472741c3728b6ccf80c121d66e90f94e Author: Jose Antonio Ortega Ruiz Date: Sun May 23 23:28:38 2010 +0200 PLT: Minimum version bumped to 5.0. README | 2 +- scheme/plt/geiser.rkt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit ef777b73dcd53f7341c32fdf04b39906c86087f3 Author: Jose Antonio Ortega Ruiz Date: Sun May 23 23:23:46 2010 +0200 PLT: Completing the .ss -> .rkt transition. scheme/plt/geiser.rkt | 6 +++--- scheme/plt/geiser/autodoc.rkt | 4 ++-- scheme/plt/geiser/completions.rkt | 6 +++--- scheme/plt/geiser/enter.rkt | 4 ++-- scheme/plt/geiser/eval.rkt | 4 ++-- scheme/plt/geiser/locations.rkt | 6 +++--- scheme/plt/geiser/main.rkt | 6 ++---- scheme/plt/geiser/modules.rkt | 15 +++++++++------ scheme/plt/geiser/user.rkt | 4 ++-- scheme/plt/geiser/utils.rkt | 6 +++--- 10 files changed, 31 insertions(+), 30 deletions(-) commit 94f76a1565f09d189d9f2cef6d3df7860321709e Author: Jose Antonio Ortega Ruiz Date: Sun May 23 23:10:52 2010 +0200 Racket support (PLT 5 needed). elisp/geiser-plt.el | 17 ++-- elisp/geiser.el | 4 +- scheme/plt/geiser.rkt | 22 +++++ scheme/plt/geiser.ss | 22 ----- scheme/plt/geiser/autodoc.rkt | 189 +++++++++++++++++++++++++++++++++++++++ scheme/plt/geiser/autodoc.ss | 189 --------------------------------------- scheme/plt/geiser/completions.rkt | 31 +++++++ scheme/plt/geiser/completions.ss | 31 ------- scheme/plt/geiser/enter.rkt | 103 +++++++++++++++++++++ scheme/plt/geiser/enter.ss | 103 --------------------- scheme/plt/geiser/eval.rkt | 81 +++++++++++++++++ scheme/plt/geiser/eval.ss | 81 ----------------- scheme/plt/geiser/locations.rkt | 54 +++++++++++ scheme/plt/geiser/locations.ss | 54 ----------- scheme/plt/geiser/main.rkt | 49 ++++++++++ scheme/plt/geiser/main.ss | 49 ---------- scheme/plt/geiser/modules.rkt | 147 ++++++++++++++++++++++++++++++ scheme/plt/geiser/modules.ss | 147 ------------------------------ scheme/plt/geiser/user.rkt | 57 ++++++++++++ scheme/plt/geiser/user.ss | 57 ------------ scheme/plt/geiser/utils.rkt | 27 ++++++ scheme/plt/geiser/utils.ss | 27 ------ 22 files changed, 774 insertions(+), 767 deletions(-) create mode 100644 scheme/plt/geiser.rkt delete mode 100644 scheme/plt/geiser.ss create mode 100644 scheme/plt/geiser/autodoc.rkt delete mode 100644 scheme/plt/geiser/autodoc.ss create mode 100644 scheme/plt/geiser/completions.rkt delete mode 100644 scheme/plt/geiser/completions.ss create mode 100644 scheme/plt/geiser/enter.rkt delete mode 100644 scheme/plt/geiser/enter.ss create mode 100644 scheme/plt/geiser/eval.rkt delete mode 100644 scheme/plt/geiser/eval.ss create mode 100644 scheme/plt/geiser/locations.rkt delete mode 100644 scheme/plt/geiser/locations.ss create mode 100644 scheme/plt/geiser/main.rkt delete mode 100644 scheme/plt/geiser/main.ss create mode 100644 scheme/plt/geiser/modules.rkt delete mode 100644 scheme/plt/geiser/modules.ss create mode 100644 scheme/plt/geiser/user.rkt delete mode 100644 scheme/plt/geiser/user.ss create mode 100644 scheme/plt/geiser/utils.rkt delete mode 100644 scheme/plt/geiser/utils.ss commit acceb169d10e6096124a79b57d1c7e2dc447d37d Author: Jose Antonio Ortega Ruiz Date: Sun Apr 18 14:11:03 2010 +0200 Missing entries in scheme/Makefile.am added. scheme/Makefile.am | 3 +++ scheme/guile/geiser/doc.scm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) commit 4ab8dda507e77b0cc089144b533b3f23f35519ca Author: Jose Antonio Ortega Ruiz Date: Fri Apr 16 20:36:26 2010 +0200 Guile: evaluation output collection reactivated. with-output-to-string was broken in guile prior to 1.9.10. README | 2 +- scheme/guile/geiser/evaluation.scm | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) commit 5685fad662ea2568a8e16dcfdc709f1476abd15c Author: Jose Antonio Ortega Ruiz Date: Thu Apr 1 03:33:59 2010 +0200 Using the scheme reader to read modules names. elisp/geiser-guile.el | 3 ++- elisp/geiser-plt.el | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) commit e6561280d19f32a9d556f729a5bfefabb950e79f Author: Jose Antonio Ortega Ruiz Date: Thu Apr 1 03:32:12 2010 +0200 More lenient scheme reader. elisp/geiser-syntax.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) commit d96fe6fc9dbad5d65abe271ceb692f732d53e2fe Author: Jose Antonio Ortega Ruiz Date: Thu Apr 1 02:19:32 2010 +0200 PLT: Major module loading surgery. This is a dangerous commit. If you use PLT and don't like to live on the edge, just stick with tag 0.0.9 until 0.0.10 is out. scheme/plt/geiser.ss | 3 +- scheme/plt/geiser/enter.ss | 103 ++++++++++++++++++++++++++++++++++++++++++++ scheme/plt/geiser/main.ss | 9 +--- scheme/plt/geiser/modules.ss | 21 +++++---- scheme/plt/geiser/user.ss | 57 ++++++++++++++++++++++++ 5 files changed, 173 insertions(+), 20 deletions(-) create mode 100644 scheme/plt/geiser/enter.ss create mode 100644 scheme/plt/geiser/user.ss commit 8c47f6099fd05e2feb7cb51e15d39911ef48411d Author: Jose Antonio Ortega Ruiz Date: Wed Mar 31 21:40:20 2010 +0200 PLT: geiser is now a regular module. elisp/geiser-plt.el | 7 +++--- scheme/plt/geiser.ss | 52 +++++++------------------------------------ scheme/plt/geiser/autodoc.ss | 4 ++-- scheme/plt/geiser/eval.ss | 6 ++--- scheme/plt/geiser/main.ss | 54 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 53 deletions(-) create mode 100644 scheme/plt/geiser/main.ss commit a2770a5c5fae6c7d845f2fe9b91ca7a1cec329e2 Author: Jose Antonio Ortega Ruiz Date: Wed Mar 31 18:40:03 2010 +0200 PLT: correct scanning of arglists in (module) forms. scheme/plt/geiser/autodoc.ss | 2 ++ 1 file changed, 2 insertions(+) commit dcbe97e5329a06a366cbbd428e8076f7cca277ee Author: Jose Antonio Ortega Ruiz Date: Wed Mar 31 11:54:06 2010 +0200 PLT: preloading available module list. scheme/plt/geiser/modules.ss | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) commit 7c6294e8a8775d59e347e29cbbbef96c8d095c11 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 28 06:58:44 2010 +0200 More robust REPL input handling. elisp/geiser-repl.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) commit 1d4c0a0474f8934aa989c1a03e6fd8f63cd9c899 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 28 06:58:12 2010 +0200 PLT: Correct version check. elisp/geiser-plt.el | 3 ++- scheme/plt/geiser.ss | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) commit c58f1093970c7fb90b44c98a7cc762453e9b7936 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 27 21:10:09 2010 +0100 PLT: Preserving pretty-printing in evaluation outputs. elisp/geiser-plt.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 4ada7d2af871ed00c33f4a57cb0cc6d445acab3a Author: Jose Antonio Ortega Ruiz Date: Sat Mar 27 15:45:52 2010 +0100 Automatically pop-up dbg buffer if there's any output during evaluation. elisp/geiser-debug.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 9a6f0303a54aa3c687e63f03e83cae63d4c8e5ce Author: Jose Antonio Ortega Ruiz Date: Sat Mar 27 15:45:14 2010 +0100 PLT: some simplifications. scheme/plt/geiser/modules.ss | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) commit 1e39c1ab55a86b66a58323bb9ea16de59f1c3e61 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 19 01:46:59 2010 +0100 Guile: better stack traces (using start-stack to delimit them). README | 4 ++-- scheme/guile/geiser/evaluation.scm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) commit ee45fc1bf84b6bf1304a621e66713963f2740f84 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 19 01:45:39 2010 +0100 Irrelevant golfing. scheme/plt/geiser/modules.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit dd4cc0dfd32ca26dad6f02c08294f8e89f5edab2 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 15 04:49:40 2010 +0100 Bug fix: M-. now works in documentation buffers. elisp/geiser-doc.el | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) commit fa7405b1a1881b15b6937e818d2de08d6be3a9c5 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 15 04:45:44 2010 +0100 Whitespace. elisp/geiser-edit.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit eb1f0a9362c8b6b19d3f4e41d32f89b94d17e873 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 13 03:49:22 2010 +0100 Guile: heuristically resolving relative paths in REPL errors. elisp/geiser-guile.el | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) commit 495a4b9bb253cb4dc443ae45fbdc2e02b7e81e4f Author: Jose Antonio Ortega Ruiz Date: Mon Mar 8 02:45:02 2010 +0100 Guile: slightly better compilation error regexps. elisp/geiser-guile.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit ed6409dd39717d623cef5cf6afd5a05cd83050a1 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 8 02:14:35 2010 +0100 Guile: 'bt' when entering the debugger. elisp/geiser-guile.el | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) commit 5713490e2ca1bb5ac77cddbbaf97cce5ac9fa0b1 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 8 02:14:03 2010 +0100 Hook to setup the debugger when it's launched. elisp/geiser-connection.el | 15 +-------------- elisp/geiser-debug.el | 5 ++++- 2 files changed, 5 insertions(+), 15 deletions(-) commit fd87a78cd54874a7f8260cdae11868d6ab718f09 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 23:43:50 2010 +0100 Better prompt behaviour in switch to REPL and module. elisp/geiser-repl.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) commit ae417f23b53c811d193fe32af23963f603545746 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 21:39:41 2010 +0100 Guile: switch to REPL and module activated. elisp/geiser-guile.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit ef17947ca8f80e67fe542b8a563b6297f3668cbe Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 21:39:13 2010 +0100 Go to geiser and switch to module: echoing. elisp/geiser-repl.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit 65babf6e0ec27d0757e36c91a4bbddcba6df9b56 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 21:29:35 2010 +0100 PLT: additional binding forms (sequence API). elisp/geiser-plt.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) commit 9a14aa781cf79eccf20aba73b91dce65c26ff2e2 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 21:29:13 2010 +0100 Implementations can now specify additional binding forms. elisp/geiser-completion.el | 20 +++++++++++++++++--- elisp/geiser-syntax.el | 26 +++++++++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) commit 9f5d185d17c1e7258b9dc3df5fce46de7945ff12 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 21:28:28 2010 +0100 Whitespace. elisp/geiser-company.el | 11 +++++++---- elisp/geiser-mode.el | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) commit 1e87980a965528177fef3cf97298f44ef02cbfc0 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 05:16:20 2010 +0100 New command to switch to REPL and put it in current module. README | 1 + elisp/geiser-guile.el | 5 +++++ elisp/geiser-mode.el | 10 ++++++++-- elisp/geiser-plt.el | 6 +++++- elisp/geiser-repl.el | 14 ++++++++++++++ 5 files changed, 33 insertions(+), 3 deletions(-) commit c60416ef24f5d97feba85674198932ffda5fdba5 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 7 04:26:08 2010 +0100 Bug fix: remember debugger settings in geiser-repl-nuke. elisp/geiser-impl.el | 9 ++++++--- elisp/geiser-repl.el | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) commit 1492336888d8eb9bf959b36e5e84190b8f1ec79d Author: Jose Antonio Ortega Ruiz Date: Mon Mar 1 01:00:20 2010 +0100 REPL: customizable auto-indenting of new lines. elisp/geiser-repl.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) commit b87e894c6d68a6c2b24bc75b65a76e1a12b3791b Author: Jose Antonio Ortega Ruiz Date: Sat Feb 27 22:57:53 2010 +0100 Better handling of multi-line input in the REPL - We don't send incomplete sexps to the underlying REPL - Automatic indentation of multi-line sexps - Syntax highlighting of scheme keywords elisp/geiser-repl.el | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) commit 070b159aa6db39cd220e76b25d6ad58b2a0e3362 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 27 22:56:26 2010 +0100 More room for recursion in the scheme reader. elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 2b57e2a87b5ba7c65a3c8fe5b997205e2d829874 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 27 22:55:44 2010 +0100 Whitespace. elisp/geiser-completion.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) commit 5d713118a24a8766ea788288c1b47c96cf9bf5a6 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 3 01:03:20 2010 +0100 PLT: Better help lookups. elisp/geiser-plt.el | 13 +++++++++---- scheme/plt/geiser/autodoc.ss | 6 +++--- scheme/plt/geiser/modules.ss | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) commit 0eaf8e78241b8bac9698ab3694d8060ac113fd56 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 2 15:59:51 2010 +0100 Elisp scheme reader: more room for recursive list scanning. elisp/geiser-syntax.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit a1d4a163464157ad5bb0b82f92a2ebfcc81aacf4 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 2 15:59:25 2010 +0100 PLT: Fix for bug retrieving module exports. scheme/plt/geiser/modules.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit f6c09395b569f273ca27bc951ec5b882f2c3da86 Author: Jose Antonio Ortega Ruiz Date: Thu Jan 28 14:54:42 2010 +0100 Guile: support for the REPL debugger On errors, we switch to the REPL, where the debugger is active. elisp/geiser-guile.el | 32 ++++++++++---------------------- scheme/guile/geiser/evaluation.scm | 19 ++++--------------- 2 files changed, 14 insertions(+), 37 deletions(-) commit bdda30e6f263f7142f2f33a8be2545d3061fb598 Author: Jose Antonio Ortega Ruiz Date: Thu Jan 28 14:53:33 2010 +0100 Generic support for debugging prompts in the REPL elisp/geiser-autodoc.el | 10 ++++-- elisp/geiser-connection.el | 92 ++++++++++++++++++++++++++++++++++++----------- elisp/geiser-debug.el | 27 +++++++------- elisp/geiser-impl.el | 5 +-- elisp/geiser-repl.el | 14 ++++++-- 5 files changed, 106 insertions(+), 42 deletions(-) commit dd0ef53303074c1217363d363c1cccc6fcad6dc7 Author: Jose Antonio Ortega Ruiz Date: Tue Jan 26 18:08:39 2010 +0100 Guile: Minimal support for the new REPL debug mode. We just don't hang when the REPL enters its debug mode, and salute any attempt at using a Geiser command with a warning (and no result). elisp/geiser-guile.el | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) commit 26e9c414608c3e287f736bbedffff291e46e6f40 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 24 20:31:21 2010 +0100 Guile: Geiser now behaves correctly in buffers for unloaded modules. elisp/geiser-eval.el | 5 +++-- elisp/geiser-guile.el | 3 +-- scheme/guile/geiser/evaluation.scm | 13 ++++++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) commit aa02b8c828bc4468e15324a68f8d97a46ca21a87 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 24 17:14:45 2010 +0100 Guile: fix for autodoc in 1.9.7 scheme/guile/geiser/doc.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit c40f4db9dce660802f1173e281d9a1e139ebd819 Author: Jose Antonio Ortega Ruiz Date: Sun Jan 17 14:09:26 2010 +0100 Minor bug fix. elisp/geiser-connection.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 37c582ee0552e67c2363ad833d6159b13c89d6d8 Author: Jose Antonio Ortega Ruiz Date: Mon Jan 11 00:32:35 2010 +0100 PLT: Fix for argument names parsing in autodoc. scheme/plt/geiser/autodoc.ss | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) commit 67118955c9862ff0cc81eaf4245ca057a31983b0 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 19 16:37:15 2009 +0100 Syntax error. elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 790d37d078079db0f81271520878eda27f4c956e Author: Jose Antonio Ortega Ruiz Date: Sat Dec 19 02:58:14 2009 +0100 Even shorter REPL mode-line. elisp/geiser-repl.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit a5ef72f290d52bf5777ea7334f9a81e2868ca5c8 Author: Jose Antonio Ortega Ruiz Date: Sat Dec 19 02:51:18 2009 +0100 Shorter mode-line lighter for REPL mode. elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 469d21cb2013b831c82a304f930266a614f95b7f Author: Jose Antonio Ortega Ruiz Date: Sat Dec 19 02:46:04 2009 +0100 Guile: adjustment to stack size display. Getting rid of geiser-specific stack info -- guile seems to be providing no useful additional info in the current version. scheme/guile/geiser/evaluation.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 62d3ee0ccb778ed571e45e44bff3eb631ed4c5e4 Author: Jose Antonio Ortega Ruiz Date: Fri Dec 18 00:35:57 2009 +0100 Guile: fix for file loading (we always compile them now). scheme/guile/geiser/evaluation.scm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) commit 9c85f8c16b82531fa4fc86412071782d2d0b842e Author: Jose Antonio Ortega Ruiz Date: Fri Dec 18 00:24:16 2009 +0100 Guile: bug in backtrace display fixed. elisp/geiser-debug.el | 3 ++- elisp/geiser-guile.el | 19 ++++++++++--------- elisp/geiser-repl.el | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) commit 1b8cc5bb9a075e30e296c953aa3f8eaa2583b327 Author: Jose Antonio Ortega Ruiz Date: Tue Nov 17 12:28:33 2009 +0100 Documentation fix (byte-compiled doesn't work in-place). README | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) commit 297b1a9dc28753378eac60255f25a66e030769ce Author: Jose Antonio Ortega Ruiz Date: Fri Nov 13 01:58:35 2009 +0100 Bug fix: displaying signatures correctly in xref buffers. elisp/geiser-autodoc.el | 5 ++++- elisp/geiser-xref.el | 12 ++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) commit e1907222291894821960dba34f2c16db831673d6 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 13 01:18:34 2009 +0100 Guile: Support for multiple arities in autodoc. scheme/guile/geiser/doc.scm | 60 +++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 27 deletions(-) commit 6e0b3e61eb8aec477ba7b668778e831934682a90 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 13 00:12:35 2009 +0100 Docs: Guile 1.9.5 required. README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit dab11d9578577b8b231a98e6a614cb5fc49c9a84 Author: Jose Antonio Ortega Ruiz Date: Fri Nov 13 00:07:54 2009 +0100 Guile: bug fix: a macro-transformer is not a good arity info source. * scheme/guile/geiser/doc.scm (obj-args): producing always ... for macros. scheme/guile/geiser/doc.scm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) commit 6ae51474d59444f44f7b363acbcbcefd0551cd5b Author: Jose Antonio Ortega Ruiz Date: Thu Nov 12 18:54:55 2009 +0100 Bug fix: links in documentation buffers work again. * elisp/geiser-impl.el (with--geiser-implementation): macro was not setting the implementation environment correctly. elisp/geiser-impl.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit e42bfdb26e7ce33f80ed8dc501824431f57473cb Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 22:03:52 2009 +0200 PLT: autodoc: support for languages specified as libs and/or module forms. elisp/geiser-plt.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit a17dad508cc8ef98d0a35c017a2ebad6cbc55e92 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 10:05:44 2009 +0200 Autodoc for identifier at point only when it's not an argument. elisp/geiser-syntax.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) commit 0a64ea424dcacf61d5b8ad42e1a064f27cb58e49 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 03:51:01 2009 +0200 Silly micro-optimisitation. elisp/geiser-syntax.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 561fd4e8fd676a0e5b0a710d9234303673b34959 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 03:22:49 2009 +0200 Autodoc fix: dots in arglists were causing a parsing error. elisp/geiser-syntax.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) commit 883afcf36399a43c6b79d3be8c60ebadac0f92c8 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 03:21:53 2009 +0200 Cosmetics. elisp/geiser-autodoc.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) commit b007b8801197325f3bd157c383bdfcace0ff57fc Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 02:34:21 2009 +0200 PLT: Evaluation takes into account #lang forms. This is useful when visiting a file that has not been loaded: the evaluation namespace is provided by its #lang, if any. While i was at it, i also refactored the mess in geiser:load-file. elisp/geiser-plt.el | 17 +++++++++++++---- scheme/plt/geiser.ss | 3 ++- scheme/plt/geiser/eval.ss | 23 ++++++++++++----------- scheme/plt/geiser/modules.ss | 34 +++++++++++++++++++--------------- 4 files changed, 46 insertions(+), 31 deletions(-) commit d56dfe6f1505b99f90a4978dffd0b592fef72a68 Author: Jose Antonio Ortega Ruiz Date: Thu Oct 15 02:29:58 2009 +0200 PLT: autodoc: parsing of definitions with more than one form fixed. scheme/plt/geiser/autodoc.ss | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) commit edbb67e675163d7a3cfbeaf9fcbcef3f44146d36 Author: Jose Antonio Ortega Ruiz Date: Sat Oct 10 01:49:49 2009 +0200 Base R6RS elisp implementation. elisp/geiser-r6rs.el | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 elisp/geiser-r6rs.el commit d3593a4dcb13f15b531cee7e71e61a1e1f604ba4 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 27 23:51:18 2009 +0200 Cosmetics. elisp/geiser-guile.el | 47 ++++++++++++++++++----------------------------- elisp/geiser-plt.el | 45 ++++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 56 deletions(-) commit fa57fec9e27da642c12244d097ae2da601f9a08d Author: Jose Antonio Ortega Ruiz Date: Sun Sep 27 22:45:58 2009 +0200 PLT: Small refactorings; rudimentary support for syntax-case arg name snarfing. scheme/plt/geiser/autodoc.ss | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) commit b8573ff1667349e87980fd1b37f48512d99449cf Author: Jose Antonio Ortega Ruiz Date: Sun Sep 27 00:32:28 2009 +0200 PLT: Ignoring errors during argument name scanning for autodoc. scheme/plt/geiser/autodoc.ss | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) commit 3b849eb2312f5ecc0ecb5a20fe574f8f69d4deb4 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 27 00:29:28 2009 +0200 PLT: autodoc arg names scanning: better case-lambda, syntax-rules added. scheme/plt/geiser/autodoc.ss | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) commit a47fe92e1f5729a9f80d22e8437fb6d961d411c4 Author: Jose Antonio Ortega Ruiz Date: Sun Sep 27 00:28:23 2009 +0200 Previous patch was broken. elisp/geiser-syntax.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) commit 6b7ee97c7f0b5fead386ad8101ad0fdf9412f710 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 22:38:21 2009 +0200 Internal fix: duplication of symbol at point in scan-sexps. elisp/geiser-syntax.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit f2f267955c46d110da4c75a5972f021a2c715a6c Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 21:44:21 2009 +0200 Multiple arity display, used by PLT backend (case-lambda). elisp/geiser-autodoc.el | 60 +++++++++++++++++++++++++-------------------- elisp/geiser-doc.el | 2 +- scheme/guile/geiser/doc.scm | 10 ++++---- scheme/plt/geiser/autodoc.ss | 57 +++++++++++++++++++++++++----------------- 4 files changed, 73 insertions(+), 56 deletions(-) commit f67ef229256de7406666dd5ffe14c229bf0b2045 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 05:07:41 2009 +0200 PLT: Bug fix in autodoc's argument name parsing. Definitions of the form (define (foo bar) (lambda ---) --) were not being matched correctly. scheme/plt/geiser/autodoc.ss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) commit a9c8026ca23ae980e0288b4657567fc586673e3c Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 04:25:13 2009 +0200 Letting implementations define their own file pattern matching rules. elisp/geiser-impl.el | 8 +++++--- elisp/geiser-plt.el | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) commit f4bfd4dbd6e91b60a80be309ffa70b7aeb7870a9 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 04:11:04 2009 +0200 Bug fix: display-help function correctly invoked when available. elisp/geiser-doc.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 574e4afbdf6f1ce1bf6c4e1fa73b7d4f5f264ece Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 03:18:25 2009 +0200 PLT: Unsupported procedures listed. elisp/geiser-plt.el | 1 + 1 file changed, 1 insertion(+) commit 9b241873039c2cf817ccc94eaa5bdd3ca2cc470f Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 03:17:55 2009 +0200 New implementation method/variable: unsupported Geiser procedures. elisp/geiser-eval.el | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) commit 3c1924595e1347644a8202a9cb5600a2a01367da Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 03:17:20 2009 +0200 Bug fix: proper handling of implementation methods specified as variables. elisp/geiser-impl.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) commit ad7badc9d24289cd1a30fc0621120d48f6462c0c Author: Jose Antonio Ortega Ruiz Date: Sat Sep 26 03:15:53 2009 +0200 Bug fix: xref commands were always asking for the target procedure's name. elisp/geiser-xref.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit d80c42a067f4eb70c9a4bc159a82912c76a99e74 Author: Jose Antonio Ortega Ruiz Date: Thu Sep 24 16:03:35 2009 +0200 Assignment of ss files to plt as a customization. elisp/geiser-impl.el | 2 +- elisp/geiser-plt.el | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) commit ee5b403d2d99ed6722063040a5328cf351b20144 Author: Jose Antonio Ortega Ruiz Date: Wed Sep 23 22:37:55 2009 +0200 Slightly more efficient symbol completion. elisp/geiser-completion.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) commit ed48236fe7c336924ff4694275555649e9b269b5 Author: Jose Antonio Ortega Ruiz Date: Wed Sep 23 18:03:52 2009 +0200 Guile: bug fix: evaluation works again (1.9.3 or better required). README | 6 +++--- scheme/guile/geiser/evaluation.scm | 22 +++++++--------------- 2 files changed, 10 insertions(+), 18 deletions(-) commit 46d6d573013661b3266ca3d0bd77b8a26a738eef Author: Jose Antonio Ortega Ruiz Date: Wed Sep 23 15:53:43 2009 +0200 Bug fix: correct generation of per implementation switch-to functions. elisp/geiser-impl.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) commit b08c317b978e14b1b4c1dfd07ccc11f6efccb6d5 Author: Jose Antonio Ortega Ruiz Date: Tue Sep 22 23:56:55 2009 +0200 Clarifying that Modified BSD is the same as BSD3. COPYING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit ac2066b6f439b2497e761fbd99c9675db0b03bbd Author: Jose Antonio Ortega Ruiz Date: Tue Sep 22 22:43:28 2009 +0200 New implementation registration mechanism, for the elisp side of things. Implementations must invoke define-geiser-implementation with an appropriate set of methods. Simple inheritance is supported. Each geiser module defines and registers the method names it uses. elisp/geiser-completion.el | 18 ++- elisp/geiser-custom.el | 6 +- elisp/geiser-debug.el | 9 +- elisp/geiser-doc.el | 17 ++- elisp/geiser-eval.el | 25 ++-- elisp/geiser-guile.el | 25 ++-- elisp/geiser-impl.el | 367 ++++++++++++++++++++++------------------------ elisp/geiser-mode.el | 5 +- elisp/geiser-plt.el | 15 ++ elisp/geiser-reload.el | 3 - elisp/geiser-repl.el | 33 ++++- elisp/geiser.el | 2 +- 12 files changed, 291 insertions(+), 234 deletions(-) commit 8588781981a686dbd921c377fa9887bcd74728af Author: Jose Antonio Ortega Ruiz Date: Tue Sep 15 00:30:06 2009 +0200 Guile: define-module forms are now individually evaluable (e.g. using C-M-x or C-x C-e). elisp/geiser-guile.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) commit b039e7aa8dc4207e4a0da34fe684265fed1b22e3 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 14 02:08:19 2009 +0200 Irrelevant doc fix. INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 0a2d332daed0c93251058cb88495ffe8157e39db Author: Jose Antonio Ortega Ruiz Date: Sat Sep 12 23:30:44 2009 +0200 Dog food: using the scheme reader for parsing evaluation results. elisp/geiser-eval.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit b131c3e5c1e954c9ce3b1324937ba89a54bc66d1 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 12 23:26:22 2009 +0200 New function: `geiser-syntax--read-from-string', analogous to elisp's `read-from-string'. elisp/geiser-syntax.el | 8 ++++++++ 1 file changed, 8 insertions(+) commit 41dbd0eda13fb41706c74174f13434e22ffe6843 Author: Jose Antonio Ortega Ruiz Date: Sat Sep 12 23:25:22 2009 +0200 Bug fix: we were not correctly detecting dot as a token in the scheme reader. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit d5dfd349a4126324ff5fb41a2c20edf8725edda9 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 22:01:14 2009 +0200 Reload: we now remember user customizations and restore them during geiser-reload. elisp/geiser-autodoc.el | 6 +++--- elisp/geiser-custom.el | 17 +++++++++++++++++ elisp/geiser-edit.el | 2 +- elisp/geiser-guile.el | 8 ++++---- elisp/geiser-impl.el | 7 ++++--- elisp/geiser-mode.el | 6 +++--- elisp/geiser-plt.el | 6 +++--- elisp/geiser-reload.el | 5 +++-- elisp/geiser-repl.el | 14 +++++++------- 9 files changed, 45 insertions(+), 26 deletions(-) commit bf4b717791be199ce21a0c36b4b7baf3f8511f66 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:38:46 2009 +0200 AUTHORS fix. AUTHORS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 993d50dc005b09e0674916de146f25867c335556 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:37:47 2009 +0200 COPYING introduction. COPYING | 5 +++++ 1 file changed, 5 insertions(+) commit e93016f0c1ae4af52f18e44673e6bdcf3492ee1a Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:34:00 2009 +0200 Un-running to conclusions. THANKS | 4 ---- 1 file changed, 4 deletions(-) commit 56b7aec90d4a3dc9a3bd7cfc5b9372338e059538 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:24:30 2009 +0200 BSD relicensing: Guile code. scheme/guile/geiser/completion.scm | 29 +++++++---------------------- scheme/guile/geiser/doc.scm | 27 ++++++--------------------- scheme/guile/geiser/emacs.scm | 27 ++++++--------------------- scheme/guile/geiser/evaluation.scm | 27 ++++++--------------------- scheme/guile/geiser/modules.scm | 27 ++++++--------------------- scheme/guile/geiser/utils.scm | 27 ++++++--------------------- scheme/guile/geiser/xref.scm | 27 ++++++--------------------- 7 files changed, 43 insertions(+), 148 deletions(-) commit 9a77f714e539723a8149302970b38f72b5f53752 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:20:33 2009 +0200 BSD relicensing: PLT code. scheme/plt/geiser.ss | 25 ++++++------------------- scheme/plt/geiser/completions.ss | 27 ++++++--------------------- scheme/plt/geiser/eval.ss | 27 ++++++--------------------- scheme/plt/geiser/locations.ss | 27 ++++++--------------------- scheme/plt/geiser/modules.ss | 23 ++++++----------------- scheme/plt/geiser/utils.ss | 27 ++++++--------------------- 6 files changed, 36 insertions(+), 120 deletions(-) commit cad3f30d164ad89a0cd1444dd3f948072031ac3a Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:16:08 2009 +0200 BSD relicensing: elisp code. elisp/geiser-autodoc.el | 26 ++++++-------------------- elisp/geiser-base.el | 23 +++++------------------ elisp/geiser-company.el | 21 ++++++--------------- elisp/geiser-compile.el | 25 ++++++------------------- elisp/geiser-completion.el | 27 +++++++-------------------- elisp/geiser-connection.el | 25 +++++++------------------ elisp/geiser-custom.el | 27 +++++++-------------------- elisp/geiser-debug.el | 28 +++++++--------------------- elisp/geiser-doc.el | 27 +++++++-------------------- elisp/geiser-edit.el | 29 ++++++++--------------------- elisp/geiser-eval.el | 25 +++++++------------------ elisp/geiser-guile.el | 25 ++++++------------------- elisp/geiser-impl.el | 26 ++++++-------------------- elisp/geiser-log.el | 23 ++++++----------------- elisp/geiser-mode.el | 26 ++++++-------------------- elisp/geiser-plt.el | 25 ++++++------------------- elisp/geiser-popup.el | 26 ++++++-------------------- elisp/geiser-reload.el | 21 ++++++--------------- elisp/geiser-repl.el | 27 ++++++--------------------- elisp/geiser-syntax.el | 27 +++++++-------------------- elisp/geiser-version.el.in | 10 +++++++++- elisp/geiser-xref.el | 25 ++++++------------------- elisp/geiser.el | 29 +++++++---------------------- scheme/plt/geiser/autodoc.ss | 23 ++++++----------------- 24 files changed, 156 insertions(+), 440 deletions(-) commit 69ab3ff61aa1d31a571710d8bc468ed41203bfe9 Author: Jose Antonio Ortega Ruiz Date: Fri Sep 11 01:15:56 2009 +0200 BSD relicensing: COPYING. COPYING | 697 +++-------------------------------------------------------------- 1 file changed, 23 insertions(+), 674 deletions(-) commit 4de073bacd80820803d129fd7f04e2c210f20442 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 7 01:24:22 2009 +0200 Bug fix: run-geiser and friends now always create a new REPL. elisp/geiser-repl.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit f5f3587b6f6a6d7375ff9f715652292070915bab Author: Jose Antonio Ortega Ruiz Date: Mon Sep 7 00:42:58 2009 +0200 Fix for regression in autodoc: it works again when point is inside a string. elisp/geiser-syntax.el | 1 + 1 file changed, 1 insertion(+) commit 8f5e58189692663901266dc83f2e2b4e47803b8d Merge: 61edb25 3a80af0 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 7 00:23:17 2009 +0200 Merge branch 'devel' commit 3a80af06f2b9272db379fed3b5b659ecfeeceb70 Author: Jose Antonio Ortega Ruiz Date: Mon Sep 7 00:17:12 2009 +0200 Scheme reader improvements: #<>, #||# and other bits. elisp/geiser-syntax.el | 62 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 18 deletions(-) commit 8d534314354d6858ec72f483b3e37cc50daaf8d8 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 30 23:53:19 2009 +0200 Improved local names detection (both implementation- and functional-wise). elisp/geiser-syntax.el | 66 +++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) commit e63eed7c83ba3d1e3a3b29aaca7b336d4a635a39 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 30 11:52:15 2009 +0200 Tagging keywords as such in the scheme reader, for later spotting of active argument in autodoc. elisp/geiser-syntax.el | 59 ++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 27 deletions(-) commit 2c6f07d95935668a82bbd549901da6d0949fbbe7 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 30 11:19:09 2009 +0200 Biting the bullet: a simple, permissive, scheme reader. Currently put to (let's hope, good) use for context parsing in autodoc and locals discovery (internal defines are recognised now). elisp/geiser-autodoc.el | 9 ++- elisp/geiser-syntax.el | 209 +++++++++++++++++++++++++++++-------------------- 2 files changed, 128 insertions(+), 90 deletions(-) commit 4308f5bf8babe700df73b384e91c2964ef431e5c Author: Jose Antonio Ortega Ruiz Date: Thu Aug 27 11:43:12 2009 +0200 Small configure tweaks. autogen.sh | 2 +- configure.ac | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) commit b75fa717536a55a7571abfd1aafe53bc73bb5363 Author: Jose Antonio Ortega Ruiz Date: Thu Aug 27 00:05:13 2009 +0200 Better detection of locals (internal defines). - The implementation is still buggy, though, because it uses the elisp reader, which bails at some scheme syntaxes (e.g. chars) elisp/geiser-syntax.el | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) commit 54ef9eae095606180a137bf2d2c11086625a7088 Author: Jose Antonio Ortega Ruiz Date: Wed Aug 26 15:13:42 2009 +0200 Quicker metadata display in company mode. elisp/geiser-company.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) commit cee169c2de13d30f213b03578e70ca7c370e2684 Author: Jose Antonio Ortega Ruiz Date: Wed Aug 26 12:23:53 2009 +0200 Company's go to location working also for locations in same file. elisp/geiser-company.el | 10 ++++++---- elisp/geiser-edit.el | 16 +++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) commit 2f5a1cce9e66e6f931749e5d3df6fe3fb220ad1f Author: Jose Antonio Ortega Ruiz Date: Wed Aug 26 00:58:36 2009 +0200 Slightly faster autodoc. elisp/geiser-autodoc.el | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) commit 1f933f075530a5397c6413cae307b3c372ae9a53 Author: Jose Antonio Ortega Ruiz Date: Wed Aug 26 00:57:58 2009 +0200 Company: handling correctly the mode lighter and autodoc interaction. elisp/geiser-company.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) commit 98e199daf7b1a56179b670c192c7d244fcb2b323 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 25 15:30:51 2009 +0200 Slightly better autodoc caching (probably needs an overhaul, though). elisp/geiser-autodoc.el | 33 ++++++++++++++++++--------------- elisp/geiser-company.el | 8 ++++---- elisp/geiser-doc.el | 3 +-- 3 files changed, 23 insertions(+), 21 deletions(-) commit f52ac22eb1c09f7eae9d53d7d12d15edac56f942 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 25 01:58:55 2009 +0200 Now this is cool: support for company mode. README | 11 +++++ elisp/Makefile.am | 1 + elisp/geiser-autodoc.el | 6 ++- elisp/geiser-company.el | 111 ++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-completion.el | 8 ++-- elisp/geiser-edit.el | 11 +++-- elisp/geiser-mode.el | 7 +++ elisp/geiser-reload.el | 1 + elisp/geiser-repl.el | 7 +++ 9 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 elisp/geiser-company.el commit 479493f40a1666cc7fb2de8f855badc7106b762b Author: Jose Antonio Ortega Ruiz Date: Mon Aug 24 03:22:12 2009 +0200 Taking into account those ugly square brackets while scanning locals. elisp/geiser-syntax.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) commit b652ff751b5c5e4210195cadbac0b404e3fe402e Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 23:19:08 2009 +0200 Putting ChangeLog to good use. .gitignore | 1 - ChangeLog | 6 ++++++ Makefile.am | 2 +- autogen.sh | 4 ---- 4 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 ChangeLog commit 45efee6e5addfe3677b218abda5fef244ec767c9 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 22:57:11 2009 +0200 autogen.sh autogen.sh | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 autogen.sh commit 833d2df2593dd391f3f88f722d90f6c64ac83ea5 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 22:35:24 2009 +0200 fixes for geiser-unload. elisp/geiser-impl.el | 9 ++++----- elisp/geiser-mode.el | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) commit bd998e8d6ed692a6d08d5f06f2d7dd55191e7a20 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 20:22:22 2009 +0200 geiser-reload works again (was broken for installed geiser). elisp/geiser-base.el | 3 +-- elisp/geiser-reload.el | 36 +++++++++++++++++------------------- 2 files changed, 18 insertions(+), 21 deletions(-) commit 1762b7b9b30ab42e878f9a3887a81f3133417062 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 15:48:57 2009 +0200 Automake tweak: geiser-install.el belongs to CLEANFILES. elisp/Makefile.am | 2 ++ 1 file changed, 2 insertions(+) commit bc740d87f846f372f06263298495a9ff1506e4c7 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 15:44:02 2009 +0200 Buglet in autodoc's argument display. elisp/geiser-autodoc.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) commit 3bf101346960ab33261354504102a4de642ed445 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 15:22:07 2009 +0200 Thanks, many THANKS. INSTALL | 4 +++- Makefile.am | 2 ++ THANKS | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 THANKS commit dfc502402d43065e182d5a21f55514514de87e8b Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 05:18:39 2009 +0200 Standardese filling. AUTHORS | 4 + INSTALL | 316 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README | 57 +++++++++--- 3 files changed, 364 insertions(+), 13 deletions(-) commit ace9896b831c1d1b458ca2504837009d8fadc600 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 03:11:40 2009 +0200 Automatic ChangeLog generation during make dist. .gitignore | 1 + Makefile.am | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) commit 11e52e18251f6c2c5a9c7c37bbd4a1787e84b282 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 02:59:09 2009 +0200 Fixes for all byte-compilation warnings. elisp/geiser-autodoc.el | 4 ++-- elisp/geiser-base.el | 20 ++-------------- elisp/geiser-completion.el | 6 ++--- elisp/geiser-doc.el | 2 +- elisp/geiser-edit.el | 5 +++- elisp/geiser-eval.el | 38 +++++++++++++++---------------- elisp/geiser-guile.el | 3 +++ elisp/geiser-impl.el | 58 ++++++++++++++++++++++++----------------------- elisp/geiser-log.el | 2 ++ 9 files changed, 66 insertions(+), 72 deletions(-) commit c5b6f124e8197c4e20278fb3f24086ee56f0e529 Author: Jose Antonio Ortega Ruiz Date: Sun Aug 23 02:58:13 2009 +0200 Autotoolification. .gitignore | 11 ++++++ AUTHORS | 0 INSTALL | 0 Makefile.am | 1 + NEWS | 0 configure.ac | 33 ++++++++++++++++ elisp/Makefile.am | 31 +++++++++++++++ elisp/geiser-install.el.in | 5 +++ elisp/geiser-reload.el | 96 +++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-version.el.in | 12 ++++++ elisp/geiser.el | 77 ++++--------------------------------- scheme/Makefile.am | 16 ++++++++ 12 files changed, 213 insertions(+), 69 deletions(-) create mode 100644 AUTHORS create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 configure.ac create mode 100644 elisp/Makefile.am create mode 100644 elisp/geiser-install.el.in create mode 100644 elisp/geiser-reload.el create mode 100644 elisp/geiser-version.el.in create mode 100644 scheme/Makefile.am commit f8760a999fc89f79d9570029b9ec593316add2f9 Author: Jose Antonio Ortega Ruiz Date: Thu Aug 20 02:58:01 2009 +0200 Bug fix: bogus regexp. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 1260755d66427531dbdbb01b03b060486b037ed5 Author: Jose Antonio Ortega Ruiz Date: Wed Aug 19 23:44:54 2009 +0200 C-c k == nuke repl README | 37 ++++++++++++++++++------------------- elisp/geiser-repl.el | 4 +++- 2 files changed, 21 insertions(+), 20 deletions(-) commit be62a84152d62a0658ee61fa46d035f676d46c27 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 18 23:46:31 2009 +0200 REPLs: using compile-shell-minor-mode. elisp/geiser-repl.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 69b30de19af8cc0d58fa177ef9d40057c15f6951 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 18 23:46:05 2009 +0200 PLT: bug fix in (module) recognition. elisp/geiser-plt.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 5a7373cd2da209e8a58b35060c0b29bd18398957 Author: Jose Antonio Ortega Ruiz Date: Tue Aug 18 06:16:57 2009 +0200 Yet another deklugdification: locals scanning moved to elisp. ... and say goodbye to the ugly parse partial sexp, reducing not only sloppy code, but also duplication and data transfers. elisp/geiser-completion.el | 5 +- elisp/geiser-syntax.el | 101 ++++++++++++++++++++------------------ scheme/guile/geiser/completion.scm | 25 ++-------- scheme/plt/geiser/completions.ss | 27 ++-------- 4 files changed, 62 insertions(+), 96 deletions(-) commit 203c989e07b43afb34f2c795cbda8126e9c0d327 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 17 16:26:38 2009 +0200 Leftover removed. scheme/guile/geiser/doc.scm | 2 -- 1 file changed, 2 deletions(-) commit 18db590dece0f88c3f2bd850a3158bb50605e2c6 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 17 16:23:45 2009 +0200 Well, i said that it was better, not that it was perfect. Autodoc buglets and support for displaying module variables too. elisp/geiser-autodoc.el | 54 ++++++++++++++++++++++----------------------- elisp/geiser-doc.el | 5 ++++- elisp/geiser-syntax.el | 20 +++++++++-------- scheme/guile/geiser/doc.scm | 16 +++++++++----- scheme/plt/geiser/autodoc.ss | 6 ++--- 5 files changed, 54 insertions(+), 47 deletions(-) commit 283e6f040449bb4f740991956007332c48308b38 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 17 04:18:02 2009 +0200 Simpler, more correct and efficient autodoc implementation. Not that it was difficult: it's replacing an ugly kludge. elisp/geiser-autodoc.el | 148 ++++++++++++++++++++++---------------------- elisp/geiser-syntax.el | 27 ++++++++ scheme/guile/geiser/doc.scm | 85 +++++++------------------ scheme/plt/geiser/autodoc.ss | 97 ++++++++--------------------- 4 files changed, 149 insertions(+), 208 deletions(-) commit 9d64bcb33f7ac1b3a06220842d04ce3c0534948e Author: Jose Antonio Ortega Ruiz Date: Tue Aug 11 15:44:54 2009 +0200 autodoc: better emacs display for opt/key markers. elisp/geiser-autodoc.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) commit db34b16737120ac0c6951c32b8d1aa838491cf84 Author: Jose Antonio Ortega Ruiz Date: Mon Aug 10 15:35:59 2009 +0200 Guile: fix for rest marker in autodoc. scheme/guile/geiser/doc.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 94be6173b640411e8205778fc7e080f6fbdac9dc Author: Jose Antonio Ortega Ruiz Date: Fri Aug 7 00:11:52 2009 +0200 kludgy fix for opt/key/rest markers in autodoc elisp/geiser-autodoc.el | 6 +++--- scheme/guile/geiser/doc.scm | 6 +++--- scheme/plt/geiser/autodoc.ss | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) commit d3df979d3e02bc68c36a9b243881a3ad638e3af9 Author: Jose Antonio Ortega Ruiz Date: Thu Jul 9 04:45:10 2009 +0200 Guile: unbreaking evaluation. scheme/guile/geiser/evaluation.scm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) commit 81766b3043a4f14a777affe5bc0b76109ae8ea0f Author: Jose Antonio Ortega Ruiz Date: Mon Jul 6 23:47:00 2009 +0200 Stray paren killed. elisp/geiser-eval.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 710d0cec8854a4e89f4948d49e614f286913f711 Author: Jose Antonio Ortega Ruiz Date: Thu Jul 2 05:29:04 2009 +0200 Simpler, nicer, more efficient handling of evaluation results. It comes with a pony too. elisp/geiser-connection.el | 1 - elisp/geiser-debug.el | 10 +++++--- elisp/geiser-eval.el | 9 ++++++- elisp/geiser-syntax.el | 10 -------- scheme/guile/geiser/evaluation.scm | 51 ++++++++++++++++++--------------------- scheme/plt/geiser/eval.ss | 8 ++++-- 6 files changed, 45 insertions(+), 44 deletions(-) commit ba38e61e768a5e2b6ccdebc09262e3186a8cf15b Author: Jose Antonio Ortega Ruiz Date: Mon Jun 29 00:27:28 2009 +0200 PLT: Better load/compile file results reporting. scheme/plt/geiser/eval.ss | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) commit 25eb14784cc57ee585fb2eca4437caad243eee59 Author: Jose Antonio Ortega Ruiz Date: Mon Jun 29 00:08:44 2009 +0200 Safer handling of file line and columns in emacs. elisp/geiser-edit.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) commit d0c74836bd62ec7adb853e8239af4005c1801aaf Author: Jose Antonio Ortega Ruiz Date: Sun Jun 28 21:47:49 2009 +0200 Bug fix: initialisation loop removed. elisp/geiser-impl.el | 13 ++++++++----- elisp/geiser-repl.el | 7 ++++--- 2 files changed, 12 insertions(+), 8 deletions(-) commit 870d60071b8bb7d56bb3c9433b8b4b07d8206a60 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 20 22:04:19 2009 +0200 REPL improvements: bailing out earlier on startup abort; C-c z DTRT for a running REPL. elisp/geiser-repl.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) commit 54bcf1930401e3fca5e132914923efa6fe4e4b3d Author: Jose Antonio Ortega Ruiz Date: Sat Jun 20 09:56:59 2009 +0200 Auxiliary function. elisp/geiser-impl.el | 3 +++ 1 file changed, 3 insertions(+) commit ed141a327f13d61f21b4d57bffe4f6c27e5ab93f Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 20:44:32 2009 +0200 New user command to unregister Scheme implementations. elisp/geiser-impl.el | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) commit b21ba5e786a4ff9a6dc9ccc76e217daf349082d9 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 17:27:31 2009 +0200 Bug fix. elisp/geiser-impl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 4487bd0759d997df25b05053b9044dfc056124e1 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 17:26:16 2009 +0200 User command to register scheme implementations (geiser-register-implementation). elisp/geiser-impl.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) commit acd64c5d448a614823c296a3e099823a706cb7e9 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 17:03:30 2009 +0200 Registered implementations are loaded by default. elisp/geiser-impl.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 64800ae4fa27b88ca8ee6c58d7edb0056e71ade6 Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 17:03:10 2009 +0200 Better display of evaluation results. elisp/geiser-debug.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 841766449b9dc14d40186a67cdceda26fc6ca4ff Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 16:52:03 2009 +0200 Guile: backtrace buttonization. elisp/geiser-guile.el | 38 ++++++++++++++++++++++++++++++++++++++ scheme/guile/geiser/emacs.scm | 3 ++- scheme/guile/geiser/xref.scm | 9 ++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) commit d2e8efd5b449bddaad5b416cb3634532a235576d Author: Jose Antonio Ortega Ruiz Date: Fri Jun 19 16:51:31 2009 +0200 Directory-specific implementations. elisp/geiser-impl.el | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) commit a16ac6bd5df86e3541892982d7694f7c1385c5e9 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 18 17:41:18 2009 +0200 PLT: Bug fix in implementation guessing. elisp/geiser-plt.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 210bae902ad7450d1284e27672526a6d7f95ad94 Author: Jose Antonio Ortega Ruiz Date: Thu Jun 18 17:30:23 2009 +0200 Will i ever get initialisation right? elisp/geiser-impl.el | 6 +++++- elisp/geiser.el | 19 +++---------------- 2 files changed, 8 insertions(+), 17 deletions(-) commit 553ed51ad792d32215098fe0384f098314238b6b Author: Jose Antonio Ortega Ruiz Date: Thu Jun 18 04:51:07 2009 +0200 Initialisation fixes. - Honouring geiser-impl-installed-implementations - Missing autoloads for customization groups added elisp/geiser.el | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) commit 75797be249aeae5b5f65850a5c2fe05e855aa1f8 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 03:25:44 2009 +0200 Refactoring. elisp/geiser-plt.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) commit 9ab8feaa541efe3ee223c8d18797ea02be3c5ff9 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 03:14:45 2009 +0200 PLT: buttonize errors implemented. elisp/geiser-plt.el | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) commit 38cf417cc36dc24e0d96681c5288ff092f1750c0 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 03:14:07 2009 +0200 Auxiliary functions to insert error links. elisp/geiser-edit.el | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) commit e582b04710dbbdb84ad9df350e3feb29dcad3c5a Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 03:13:38 2009 +0200 Implementation-specific backtrace display. elisp/geiser-debug.el | 11 ++++++++--- elisp/geiser-impl.el | 3 +++ elisp/geiser.el | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) commit 7d43df1ae0815171e22637ac0698a95039396acd Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 03:12:33 2009 +0200 Whitespace. elisp/geiser-connection.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 184fd00d6f3bd1ca3ad0e6c1d93731d649668f4a Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 01:57:36 2009 +0200 PLT: Fixing the fix. scheme/plt/geiser/eval.ss | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) commit 2045e7b4f66685dc1beb1159900e91df3195cc99 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 00:53:36 2009 +0200 Circular dependencies between elisp modules eliminated. elisp/geiser-doc.el | 16 +++++----------- elisp/geiser-impl.el | 12 +++--------- elisp/geiser.el | 4 ++-- 3 files changed, 10 insertions(+), 22 deletions(-) commit 397bb86ecd17794b220c6b6c81fe1b0f66c19ba6 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 17 00:05:34 2009 +0200 Whitespace. elisp/geiser-doc.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) commit 70ffe7d5bb59cbd442b5cf84f8e7c985bfda0ee8 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 16 23:15:16 2009 +0200 Fixes in retort parsing. elisp/geiser-connection.el | 4 ++-- elisp/geiser-impl.el | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) commit 547363acef3c40350382bea812a533c6dbd532cc Author: Jose Antonio Ortega Ruiz Date: Tue Jun 16 23:14:34 2009 +0200 PLT: Output included in retorts. scheme/plt/geiser/eval.ss | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) commit 230ca2d12926ecda1fe2946e2726079fcbd05ef4 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 16 22:36:15 2009 +0200 Elimination of dead code in stack trace display. elisp/geiser-debug.el | 46 +++++++++++++++------------------------------- elisp/geiser-eval.el | 3 +-- 2 files changed, 16 insertions(+), 33 deletions(-) commit 1dd9eeb3cb80260738a5683e9a41b6f66acd7460 Author: Jose Antonio Ortega Ruiz Date: Tue Jun 16 22:35:21 2009 +0200 Better parsing of scheme retorts in the Emacs end. elisp/geiser-connection.el | 10 +++++++--- elisp/geiser-syntax.el | 21 ++++----------------- 2 files changed, 11 insertions(+), 20 deletions(-) commit 3c8e22e4aaa3cbac830d4a37af6db3395082fb66 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 14 22:19:36 2009 +0200 Fixes in geiser-reload (unload forcibly and pick repl implementations). elisp/geiser-impl.el | 2 +- elisp/geiser-repl.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit c042571626977f12916d59966ea94ded44d8cf32 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 14 22:05:23 2009 +0200 Guile: Bug fix in the latest evaluation code changes. scheme/guile/geiser/evaluation.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit ee5412e57af6f22b623cbe772fec2f0af91038d7 Author: Jose Antonio Ortega Ruiz Date: Sun Jun 14 01:23:41 2009 +0200 Guile: better stack trace display. scheme/guile/geiser/evaluation.scm | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) commit 61edb258a45d5ad00ee907594c6dfbcd21d93485 Author: Jose Antonio Ortega Ruiz Date: Sat Jun 13 03:50:23 2009 +0200 Guile: rewriting stack trace captures - not yet complete. elisp/geiser-connection.el | 3 +- elisp/geiser-debug.el | 16 +++----- elisp/geiser-guile.el | 3 +- elisp/geiser-syntax.el | 38 +++++++++++------- scheme/guile/geiser/evaluation.scm | 84 ++++++++++----------------------------- 5 files changed, 54 insertions(+), 90 deletions(-) commit 56598777f2c0a50ca78065d284f2d9c8a9c4fb98 Author: Jose Antonio Ortega Ruiz Date: Wed Jun 10 21:08:34 2009 +0200 Share scheme-indent-function tweaks across implementations. elisp/geiser-base.el | 5 ----- elisp/geiser-plt.el | 44 -------------------------------------------- elisp/geiser-syntax.el | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 46 insertions(+), 54 deletions(-) commit 26929de58ec387bcdac0010067c310dbc6ff0d2a Author: Jose Antonio Ortega Ruiz Date: Mon May 25 23:18:55 2009 +0200 module-children -> module-exports. elisp/geiser-doc.el | 10 +++++----- scheme/guile/geiser/emacs.scm | 2 +- scheme/guile/geiser/modules.scm | 4 ++-- scheme/plt/geiser.ss | 4 ++-- scheme/plt/geiser/modules.ss | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) commit 2b5abe839c5cbf34fa19e2298366973c4ec812f9 Author: Jose Antonio Ortega Ruiz Date: Mon May 25 04:36:32 2009 +0200 README tweaks and updates. README | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) commit 0870749738a8473678f7021a2b9bed0f90080350 Author: Jose Antonio Ortega Ruiz Date: Mon May 25 04:29:48 2009 +0200 Fix to documentation browser's switch to repl keybinding. elisp/geiser-doc.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit ac726e6c49846b920466650fe9f3b57b1eb50e20 Author: Jose Antonio Ortega Ruiz Date: Mon May 25 03:39:47 2009 +0200 PLT: New help functionality: - Using our own help function, which takes care of trying on not yet loaded modules. - Module children implemented. elisp/geiser-plt.el | 4 ++-- scheme/plt/geiser.ss | 6 +++++- scheme/plt/geiser/autodoc.ss | 9 +++++++-- scheme/plt/geiser/modules.ss | 22 ++++++++++++++++++++-- 4 files changed, 34 insertions(+), 7 deletions(-) commit 76d5f69c79182687225248a7a0e424ef990daafd Author: Jose Antonio Ortega Ruiz Date: Mon May 25 03:36:51 2009 +0200 Bug fix and a bit of refactoring in geiser-doc.el. elisp/geiser-doc.el | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) commit 2894d527589de0020d4ccacbb883e0b8823ee4ae Author: Jose Antonio Ortega Ruiz Date: Sun May 24 20:59:00 2009 +0200 Unintended change undone. elisp/geiser-plt.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 48099d99f38b67667e680263a65a84990b741078 Author: Jose Antonio Ortega Ruiz Date: Sun May 24 20:32:38 2009 +0200 Small nit. scheme/plt/geiser/modules.ss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit 1036c4ca03505436221ab5bace389c8ad000b867 Author: Jose Antonio Ortega Ruiz Date: Sun May 24 20:20:24 2009 +0200 PLT: correct (or, at least, better) computation of module names. elisp/geiser-plt.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) commit aa0126ced4d1b35d7e8c7ea5e49637dbed997bb5 Author: Jose Antonio Ortega Ruiz Date: Sun May 24 20:19:18 2009 +0200 Elisp leftovers trimmed. elisp/geiser-completion.el | 3 +-- elisp/geiser-eval.el | 2 +- elisp/geiser-syntax.el | 13 ------------- 3 files changed, 2 insertions(+), 16 deletions(-) commit 18933e07da1f255fe30d236cd1d525373084f0d0 Author: Jose Antonio Ortega Ruiz Date: Sun May 24 20:18:10 2009 +0200 Bug fix: delete results buffers only when a new request is available. elisp/geiser-connection.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) commit 908d883f98c06a5c211efdbebbb0f27cde335fc8 Author: Jose Antonio Ortega Ruiz Date: Sun May 24 01:42:45 2009 +0200 PLT: customizable collection directories. elisp/geiser-plt.el | 6 ++++++ 1 file changed, 6 insertions(+) commit 32ba9dcfb9db2ef8575e81211fe8681a84b46bf0 Author: Jose Antonio Ortega Ruiz Date: Sat May 23 22:20:53 2009 +0200 Guile: customizable load path. elisp/geiser-guile.el | 7 +++++++ 1 file changed, 7 insertions(+) commit 85e02446e1c721049d789c4d2f86d6bf96f46c26 Author: Jose Antonio Ortega Ruiz Date: Wed May 20 22:40:36 2009 +0200 Fixes for module names reading and evaluation result display. elisp/geiser-completion.el | 13 ++++++------- elisp/geiser-debug.el | 2 +- elisp/geiser-edit.el | 2 +- elisp/geiser-guile.el | 5 ----- 4 files changed, 8 insertions(+), 14 deletions(-) commit a628778c084178653570ea423d530324fb0ce07c Author: Jose Antonio Ortega Ruiz Date: Mon May 18 01:41:26 2009 +0200 Autodoc: correct detection of start of string in argument highlighting. elisp/geiser-syntax.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) commit c3c97cec142491dbaca7b295a9f5a2951cdd7e69 Author: Jose Antonio Ortega Ruiz Date: Sun May 17 21:34:00 2009 +0200 Read-only-ness of REPL prompt customizable. elisp/geiser-repl.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) commit eddeeb5a3614c40470c7abaf55993d5d91cbdd49 Author: Jose Antonio Ortega Ruiz Date: Sat May 16 00:34:23 2009 +0200 as an alias of bol in the REPL. elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit 588b11871548e3eb8712cca5dc710462e34d8e03 Author: Jose Antonio Ortega Ruiz Date: Sat May 16 00:31:20 2009 +0200 PLT: A bit more sensible prompt format. elisp/geiser-plt.el | 2 +- scheme/plt/geiser/eval.ss | 2 +- scheme/plt/geiser/modules.ss | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) commit 774235f8f08166dbe1311047235fa160a37a3d08 Author: Jose Antonio Ortega Ruiz Date: Sat May 16 00:12:07 2009 +0200 Automatic setup when loading geiser.el (explicit call to geiser-setup no longer needed). README updates. README | 124 ++++++++++++++++++++++++++++----------------------------- elisp/geiser.el | 5 +++ 2 files changed, 66 insertions(+), 63 deletions(-) commit 2b0aefb48c0a4fec12466122d9b54b1894824ee3 Author: Jose Antonio Ortega Ruiz Date: Sat May 16 00:01:21 2009 +0200 PLT: Correct identification of explicit module definitions. elisp/geiser-plt.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) commit 50d81a75a81994e09b4fa52d1e34bef45ac21f9c Author: Jose Antonio Ortega Ruiz Date: Fri May 15 15:27:20 2009 +0200 Bug fix: compile-and-go-to-repl should work now. elisp/geiser-mode.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit 3e97539c10bee3aba376b37e988d2570f071965c Author: Jose Antonio Ortega Ruiz Date: Fri May 15 14:12:01 2009 +0200 Bug fix: smart tab mode was broken. elisp/geiser-completion.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e56277b22d668b6b46222d89054cc4842a1c0239 Author: Jose Antonio Ortega Ruiz Date: Fri May 15 13:42:41 2009 +0200 PLT: Bug fix: correctly handle explicit module definitions. elisp/geiser-plt.el | 2 +- scheme/plt/geiser/modules.ss | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) commit 6b108fd3183192088ce94110b74d757360a29702 Author: Jose Antonio Ortega Ruiz Date: Fri May 15 02:19:07 2009 +0200 Bug fix: eval-and-go family of commands work again. elisp/geiser-mode.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit f5a7cc108021208cd9b90ec4258ff2dfd36f7832 Author: Jose Antonio Ortega Ruiz Date: Fri May 15 00:47:05 2009 +0200 PLT: Initialization fixes and cleanups. * Check for required minimum version (4.1.5.5). * Colons instead of dashes in exported identifiers. * Unneeded requires are gone. * All significant code inside the geiser module. README | 2 +- elisp/geiser-plt.el | 2 +- scheme/plt/geiser.ss | 56 ++++++++++++++++++++++++++--------------------------- 3 files changed, 30 insertions(+), 30 deletions(-) commit 783ab50f4cba76b45fe1cacac66a153331aafb13 Author: Jose Antonio Ortega Ruiz Date: Thu May 14 13:07:54 2009 +0200 Fixing the mess during initialization. elisp/geiser-guile.el | 6 ------ elisp/geiser-impl.el | 7 +------ elisp/geiser-plt.el | 6 ------ elisp/geiser-syntax.el | 1 + elisp/geiser.el | 8 +++++++- 5 files changed, 9 insertions(+), 19 deletions(-) commit 76441ec53587fbbfb7176eb280461f4bc2e1519b Author: Jose Antonio Ortega Ruiz Date: Thu May 14 00:03:01 2009 +0200 Dead code. elisp/geiser-larceny.el | 118 ------------------------------------------------- 1 file changed, 118 deletions(-) delete mode 100644 elisp/geiser-larceny.el commit f379e2ab5bfebe8e1c0bbd0da57ff83e7dc0cd03 Author: Jose Antonio Ortega Ruiz Date: Thu May 14 00:00:22 2009 +0200 README updates. README | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) commit 091d1cdd2c4d532f651dc6e2ba1a09e023f3e7d6 Author: Jose Antonio Ortega Ruiz Date: Wed May 13 23:15:27 2009 +0200 Bug fix: correct guessing for installed implementations. elisp/geiser-impl.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) commit 369b3e464bded04224ad63416584ba61e798b293 Author: Jose Antonio Ortega Ruiz Date: Wed May 13 23:14:47 2009 +0200 Bug fix: current buffer's impl is used now in switch-to-geiser. elisp/geiser-repl.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) commit 440b40c47d553d53ece268e2988123feaadbb2d6 Author: Jose Antonio Ortega Ruiz Date: Mon May 11 02:32:30 2009 +0200 Bug fix: be aware of square brackets when retrieving context form. elisp/geiser-syntax.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) commit 273866952c4037d9585dd97c42c822bc6c40187e Author: Jose Antonio Ortega Ruiz Date: Mon May 11 02:25:43 2009 +0200 PLT: Support in autodoc for curried definitions. scheme/plt/geiser/autodoc.ss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 4525bffdc526709eb94d42051353d1cf6d383b82 Author: Jose Antonio Ortega Ruiz Date: Mon May 11 02:07:40 2009 +0200 PLT: fixes for module name parsing (C-cC-em works now). elisp/geiser-plt.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) commit 2696effa0a69fbba33142f2842e4e2523e485109 Author: Jose Antonio Ortega Ruiz Date: Mon May 11 01:51:09 2009 +0200 PLT: fixes for module name completion. scheme/plt/geiser.ss | 6 +++--- scheme/plt/geiser/completions.ss | 25 ++++++++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) commit 4e1bfdb594e5606f68a41e280c75776e2fb0917e Author: Jose Antonio Ortega Ruiz Date: Mon May 11 01:36:00 2009 +0200 Guile: bug fix (missing module import). scheme/guile/geiser/modules.scm | 1 + 1 file changed, 1 insertion(+) commit 0a0813c9314518007decbbe641fb131f99ae57d0 Author: Jose Antonio Ortega Ruiz Date: Mon May 11 01:27:16 2009 +0200 PLT: missing export. scheme/plt/geiser.ss | 2 ++ 1 file changed, 2 insertions(+) commit d7657c533921de69d1805f7bf3b40d9426d7800b Author: Jose Antonio Ortega Ruiz Date: Mon May 11 01:22:49 2009 +0200 Improvements to module name support (using prefixes) and Guile support. elisp/geiser-completion.el | 17 ++++++++++------- scheme/guile/geiser/completion.scm | 9 ++++++++- scheme/guile/geiser/emacs.scm | 2 +- scheme/guile/geiser/modules.scm | 13 ++++++------- 4 files changed, 25 insertions(+), 16 deletions(-) commit c09f5bbaa836d04a9babdff0943dc596dbc68e38 Author: Jose Antonio Ortega Ruiz Date: Fri May 8 01:48:52 2009 +0200 Module completion generalized and implemented for PLT. elisp/geiser-completion.el | 14 ++++++++------ elisp/geiser-guile.el | 6 ++++++ elisp/geiser-impl.el | 18 ++++++++++++++---- elisp/geiser-plt.el | 3 +++ scheme/plt/geiser.ss | 8 +++++++- scheme/plt/geiser/modules.ss | 42 +++++++++++++++++++++++++++++++++++++++++- 6 files changed, 79 insertions(+), 12 deletions(-) commit 9127a121c76f5d5606bca9a668bda5509ec3b830 Author: Jose Antonio Ortega Ruiz Date: Thu May 7 22:55:45 2009 +0200 PLT autodoc: define-for-syntax. scheme/plt/geiser/autodoc.ss | 4 ++++ 1 file changed, 4 insertions(+) commit 6fa9ca6e3372eddbb0c5a34e477db9447f87b22a Author: Jose Antonio Ortega Ruiz Date: Thu May 7 22:53:32 2009 +0200 Better handling of initial setup (registering implementations). elisp/geiser-impl.el | 10 ++++++++++ elisp/geiser.el | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) commit a883b94eaf23ba291c3a8481440358c572a67f0b Author: Jose Antonio Ortega Ruiz Date: Wed May 6 21:29:52 2009 +0200 Small refactoring. scheme/plt/geiser/modules.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 4d9ac1be1f1c5357c2f590e24ec8ef97ebb01e27 Author: Jose Antonio Ortega Ruiz Date: Wed May 6 03:11:27 2009 +0200 PLT: M-. is also able to locate modules. Refactorings. scheme/plt/geiser/autodoc.ss | 2 +- scheme/plt/geiser/eval.ss | 38 ++----------------- scheme/plt/geiser/locations.ss | 17 +++++++-- scheme/plt/geiser/modules.ss | 87 +++++++++++++++++++++++++++++++++++++++++++ scheme/plt/geiser/utils.ss | 24 +----------- 5 files changed, 107 insertions(+), 61 deletions(-) create mode 100644 scheme/plt/geiser/modules.ss commit a7cde6cd6c4677c4618ece3602890d6f6782cd48 Author: Jose Antonio Ortega Ruiz Date: Mon May 4 21:16:08 2009 +0200 PLT: define-syntax-rule in autodoc. scheme/plt/geiser/autodoc.ss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) commit b85aab287022ac402f2d5ac588709282b6efa449 Author: Jose Antonio Ortega Ruiz Date: Mon May 4 21:15:44 2009 +0200 Dead code elimination. scheme/plt/geiser/completions.ss | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) commit 1de0625a0a4ec28744e6d7fec45e7713ee505cfa Author: Jose Antonio Ortega Ruiz Date: Mon May 4 20:49:46 2009 +0200 PLT: argument position and syntax and variable recognition in autodoc. scheme/plt/geiser/autodoc.ss | 120 ++++++++++++++++++++++++++++++-------------- scheme/plt/geiser/utils.ss | 4 +- 2 files changed, 85 insertions(+), 39 deletions(-) commit 41ec4384042deaf4a6093594a4dbff2958485e32 Author: Jose Antonio Ortega Ruiz Date: Mon May 4 20:49:20 2009 +0200 Autodoc: support for info about variables. elisp/geiser-autodoc.el | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) commit cdd90c3af5a1a0fcd206293e8c8cb584b575e4f0 Author: Jose Antonio Ortega Ruiz Date: Mon May 4 01:05:33 2009 +0200 PLT: autodoc (without argument positions). elisp/geiser-plt.el | 1 + scheme/plt/geiser.ss | 4 +- scheme/plt/geiser/autodoc.ss | 160 ++++++++++++++++++++++++++++++++++++++++++ scheme/plt/geiser/eval.ss | 4 +- scheme/plt/geiser/locations.ss | 7 +- scheme/plt/geiser/utils.ss | 43 ++++++++---- 6 files changed, 198 insertions(+), 21 deletions(-) create mode 100644 scheme/plt/geiser/autodoc.ss commit 10fc0f3411cf838ee67e01df75fe8d84de367319 Author: Jose Antonio Ortega Ruiz Date: Sun May 3 13:44:22 2009 +0200 Better edit location heuristics. elisp/geiser-edit.el | 20 +++++++++++++++++--- scheme/plt/geiser/locations.ss | 27 ++++++++++++++++++--------- 2 files changed, 35 insertions(+), 12 deletions(-) commit 78152318f5e6fb8ad315bd72a8b9257ec4b91b4b Author: Jose Antonio Ortega Ruiz Date: Sun May 3 03:19:43 2009 +0200 Hopefully harmless refactoring. scheme/plt/geiser/eval.ss | 22 +++++-------------- scheme/plt/geiser/locations.ss | 13 +++++++++--- scheme/plt/geiser/utils.ss | 49 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 scheme/plt/geiser/utils.ss commit 8d4246f0b5cf3cfbe3a0cc3a9526d370ea9c26e1 Author: Jose Antonio Ortega Ruiz Date: Sun May 3 01:49:40 2009 +0200 PLT: handling correctly multiple values in evaluations. scheme/plt/geiser/eval.ss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) commit 533e4133307e9931838a2b6a50eb4c9474b81973 Author: Jose Antonio Ortega Ruiz Date: Sun May 3 01:22:01 2009 +0200 Wrapping arbitrary regions with a begin block before evaluation/expansion. elisp/geiser-debug.el | 28 ++++++++++++++++++---------- elisp/geiser-mode.el | 33 ++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 19 deletions(-) commit 53f1b00552be4057af7c0ef19d708bb2bbf86952 Author: Jose Antonio Ortega Ruiz Date: Sun May 3 01:21:03 2009 +0200 PLT: simple macroexpand. scheme/plt/geiser.ss | 2 ++ scheme/plt/geiser/eval.ss | 7 +++++++ 2 files changed, 9 insertions(+) commit bfcb656cd2f17b6cfc90afa0c535c95294863558 Author: Jose Antonio Ortega Ruiz Date: Sat May 2 22:38:32 2009 +0200 PLT: better module name in REPL prompt. scheme/plt/geiser/eval.ss | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) commit bec42c549db978bdce5709c93c9e39e4f3a45885 Author: Jose Antonio Ortega Ruiz Date: Sat May 2 22:37:56 2009 +0200 PLT in default implementations at startup. elisp/geiser.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit e5624bcc1b001f3839b7dba3bc3f396799dca75f Author: Jose Antonio Ortega Ruiz Date: Sat May 2 15:16:20 2009 +0200 REPL: C-d does not send EOF. Kill scheme with C-cC-d if you need to. elisp/geiser-repl.el | 2 ++ 1 file changed, 2 insertions(+) commit 410eaca7a6ed7565bdacc92e411fa20627da08e7 Author: Jose Antonio Ortega Ruiz Date: Fri May 1 23:10:53 2009 +0200 PLT: Current module in REPL prompt and don't change it after C-cC-l. scheme/plt/geiser.ss | 16 ++++------------ scheme/plt/geiser/eval.ss | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 19 deletions(-) commit f58c500ab06445481e710995ec5779ebd5ddc1b0 Author: Jose Antonio Ortega Ruiz Date: Fri May 1 13:23:22 2009 +0200 Better guessing for edit locations. elisp/geiser-edit.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit cce611b5d3f24273d22eafd66544457a79a0bf6b Author: Jose Antonio Ortega Ruiz Date: Fri May 1 13:20:39 2009 +0200 PLT: Enter loaded module after C-cC-l. scheme/plt/geiser/eval.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit c4aef753ffe087961b9f078913724755d2ce0938 Author: Jose Antonio Ortega Ruiz Date: Fri May 1 13:19:49 2009 +0200 Irrelevant refactoring. elisp/geiser-connection.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit eb521e1ecc9a27e3ef208a6a4d01ec6edb88a0f7 Author: Jose Antonio Ortega Ruiz Date: Thu Apr 30 00:37:49 2009 +0200 Bail out if scheme dies while waiting for an evaluation result. elisp/geiser-connection.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) commit 62a12ad5d23520d93a30c38db083bdbfd248b77e Author: Jose Antonio Ortega Ruiz Date: Thu Apr 30 00:03:22 2009 +0200 PLT: Help fix. elisp/geiser-base.el | 5 ++++ elisp/geiser-plt.el | 80 ++++++++++++++++++++++++++--------------------------- scheme/plt/geiser.ss | 1 + 3 files changed, 46 insertions(+), 40 deletions(-) commit fbd809ff8c48f12d1b13caae70810421aaa0aef4 Author: Jose Antonio Ortega Ruiz Date: Tue Apr 28 00:50:18 2009 +0200 Fixes for eval/compilation error display. elisp/geiser-compile.el | 6 +++--- elisp/geiser-debug.el | 26 ++++++++++++-------------- elisp/geiser-plt.el | 1 + 3 files changed, 16 insertions(+), 17 deletions(-) commit 31a4bd02c78be39cdd4a58bbc286a57906a525ce Author: Jose Antonio Ortega Ruiz Date: Mon Apr 27 21:28:51 2009 +0200 Support for external help functions (and application to PLT). elisp/geiser-doc.el | 38 +++++++++++++++++++++++--------------- elisp/geiser-impl.el | 13 +++++++++++-- elisp/geiser-plt.el | 7 +++++++ elisp/geiser.el | 8 +++++++- 4 files changed, 48 insertions(+), 18 deletions(-) commit 71cb453f51d7cd04834916a5df0b477f9175853c Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 21:14:49 2009 +0200 PLT: source locations. scheme/plt/geiser.ss | 5 ++++- scheme/plt/geiser/locations.ss | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 scheme/plt/geiser/locations.ss commit 2e9d01f42864f8683032a1a1d54419c984844b29 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 19:24:04 2009 +0200 PLT: completion support. scheme/plt/geiser.ss | 5 +++- scheme/plt/geiser/completions.ss | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 scheme/plt/geiser/completions.ss commit ad8f2f069f9cec540fc09b2c2b704211f75a3e8f Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 16:50:10 2009 +0200 PLT: load-file and improvements to evaluation. scheme/plt/geiser.ss | 4 ++++ scheme/plt/geiser/eval.ss | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) commit fca39ead02621a8568adbec81ea569f8beb8c39d Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 15:08:48 2009 +0200 run-geiser is now aware of the current buffer's implementation. elisp/geiser-repl.el | 1 + 1 file changed, 1 insertion(+) commit ca867c2f73cca99fceecf949336f51f99fcb1a17 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 15:08:16 2009 +0200 PLT: evaluation functions moved to their own module. scheme/plt/geiser.ss | 39 +++-------------------------- scheme/plt/geiser/eval.ss | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 35 deletions(-) create mode 100644 scheme/plt/geiser/eval.ss commit deaddf8a891dd31af63a9881e2c9d4e53ff5ae71 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 14:07:28 2009 +0200 PLT: more robust (and somewhat simpler) evaluation. scheme/plt/geiser.ss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) commit df593e60b078759d88daf98c18112821fe70a8a7 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 26 13:50:35 2009 +0200 PLT support: basic startup and evaluation working. elisp/geiser-eval.el | 24 +++++--- elisp/geiser-plt.el | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser.el | 2 +- scheme/plt/geiser.ss | 86 ++++++++++++++++++++++++++++ 4 files changed, 264 insertions(+), 10 deletions(-) create mode 100644 elisp/geiser-plt.el create mode 100644 scheme/plt/geiser.ss commit ad873e433af602e66ae1ca6da3cc07309b998879 Author: Jose Antonio Ortega Ruiz Date: Thu Apr 9 08:13:15 2009 +0200 Minor nits elisp/geiser-xref.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit c6b5406134cbd5d16f3175dcef77006a26dcf83b Author: Jose Antonio Ortega Ruiz Date: Sun Apr 5 12:08:55 2009 +0200 Xrefs formatting nits. elisp/geiser-xref.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 9f2516cd6aa09b6297088aa56aa5dd42d9761b5a Author: Jose Antonio Ortega Ruiz Date: Sun Apr 5 12:05:04 2009 +0200 Bug fix. elisp/geiser-xref.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) commit 529035ce32fe7fec27edd8e9fbce651d1e9aaf34 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 5 11:40:01 2009 +0200 Better xrefs display (classified by module). elisp/geiser-xref.el | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) commit 8e72e66019fdab0fe2ea8f57faec57c06f7bf108 Author: Jose Antonio Ortega Ruiz Date: Sun Apr 5 06:40:05 2009 +0200 Using the new (system xref) interface. scheme/guile/geiser/xref.scm | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) commit 0dcfbf2be66437b4a453a09b6485e8bc65218558 Author: Jose Antonio Ortega Ruiz Date: Fri Apr 3 10:09:52 2009 +0200 Print bye-bye message when leaving repl with C-d. elisp/geiser-repl.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit c53bdcf0574384c12b18ee27158d9d6ae8238e4f Author: Jose Antonio Ortega Ruiz Date: Wed Apr 1 11:54:01 2009 +0200 Better xref display. elisp/geiser-xref.el | 25 +++++++++++++++++++------ scheme/guile/geiser/xref.scm | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) commit 65f268c860571158fff9aca4b0b8d083e2443e14 Author: Jose Antonio Ortega Ruiz Date: Wed Apr 1 07:45:32 2009 +0200 Bug fix: really remove killed buffers from the list of closed repls. elisp/geiser-repl.el | 3 ++- scheme/guile/geiser/modules.scm | 6 ++++-- scheme/guile/geiser/xref.scm | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) commit cf5069a87c22f36a5e8e08f60bb7239742d63832 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 21 00:47:02 2009 +0100 Echo area message while retrieving xrefs. elisp/geiser-xref.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit a7b99970792a9b0c4d4ed1187c7da39c99920015 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 20 22:59:52 2009 +0100 Missing require. elisp/geiser-mode.el | 1 + 1 file changed, 1 insertion(+) commit f1d132964fc278de6decc8442d09183e4b2c4d37 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 20 01:32:38 2009 +0100 Reuse closed REPL buffers. elisp/geiser-repl.el | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) commit d603b236b6debf43f9b5bfb7f25312527ae51dc3 Author: Jose Antonio Ortega Ruiz Date: Thu Mar 19 02:14:53 2009 +0100 More robust sexp scanning for autodoc. elisp/geiser-syntax.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) commit 8e9a3eb9870b781b42bf4f2f4488579ad417e84f Author: Jose Antonio Ortega Ruiz Date: Thu Mar 19 01:52:52 2009 +0100 Guile: use the compiler by default to perform evaluations. elisp/geiser-guile.el | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) commit 845dbdb35e4b282a138bb7ad54a295199d642b4b Author: Jose Antonio Ortega Ruiz Date: Wed Mar 18 23:59:12 2009 +0100 Callers/callees (C-c <, C-c >). README | 2 ++ elisp/geiser-eval.el | 2 +- elisp/geiser-mode.el | 2 ++ elisp/geiser-xref.el | 57 +++++++++++++++++++++++++++++--------------- scheme/guile/geiser/emacs.scm | 4 +++- scheme/guile/geiser/xref.scm | 34 +++++++++++++++++++------- 6 files changed, 72 insertions(+), 29 deletions(-) commit 89e9c57a0766bf9a1610c6239bb4c55db14d54e6 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 17 14:01:06 2009 +0100 Accept a list as Guile binary. elisp/geiser-guile.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) commit 5148f813564d051347bf611afcbd7582f009aaa9 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 17 13:38:12 2009 +0100 Bug fix. elisp/geiser-repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit fe377ee5eda90a7426ff9e6dc3591c6b9e04c66d Author: Jose Antonio Ortega Ruiz Date: Tue Mar 17 13:36:40 2009 +0100 Misc nits and work in progress. elisp/geiser-debug.el | 2 +- elisp/geiser-guile.el | 2 +- elisp/geiser-impl.el | 3 +++ elisp/geiser-larceny.el | 17 +++++++++++++++-- elisp/geiser-repl.el | 1 + elisp/geiser.el | 9 ++++++++- 6 files changed, 29 insertions(+), 5 deletions(-) commit 880d17da7bdd08da11dd3c8d55da98b1f8c34b0c Author: Jose Antonio Ortega Ruiz Date: Mon Mar 16 02:56:11 2009 +0100 Key for geiser-set-scheme in geiser-mode. README | 1 + elisp/geiser-impl.el | 32 +++++++++++++++----------------- elisp/geiser-mode.el | 2 ++ 3 files changed, 18 insertions(+), 17 deletions(-) commit bedcd027dced5111cc1a2fa91ba34c3d71b226d2 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 16 02:39:27 2009 +0100 Segregate REPL history files by implementation. elisp/geiser-repl.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) commit 8dcd0a4d874f1d51f33f1b8a993b6c4f7754abf6 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 16 01:39:55 2009 +0100 Elisp-side larceny. elisp/geiser-larceny.el | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 elisp/geiser-larceny.el commit da9cae93e180463bb158461f5d008da83c172ed7 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 16 01:39:28 2009 +0100 Many a bug fix in multiple implementation support. elisp/geiser-doc.el | 2 +- elisp/geiser-eval.el | 7 +------ elisp/geiser-impl.el | 32 ++++++++++++++++++++++++++------ elisp/geiser-mode.el | 7 +++++++ elisp/geiser-repl.el | 36 ++++++++++++++---------------------- 5 files changed, 49 insertions(+), 35 deletions(-) commit d7642ed7d0e3184921835644d8dde0b1b50e1e6f Author: Jose Antonio Ortega Ruiz Date: Sun Mar 15 15:55:46 2009 +0100 Multiple values as evaluation result supported. elisp/geiser-eval.el | 6 +++++- scheme/guile/geiser/evaluation.scm | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) commit 660fc8e0465e48812fc6f38f82d91d22b0664118 Author: Jose Antonio Ortega Ruiz Date: Sat Mar 14 12:42:09 2009 +0100 Show implementation in geiser-mode's modeline. elisp/geiser-impl.el | 7 +++++-- elisp/geiser-mode.el | 8 ++++++-- elisp/geiser-repl.el | 8 ++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) commit 137d2e0db5efe444f6f208aba8ebd57584f1ee52 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 13 02:02:40 2009 +0100 Module documentation command works again when invoked from the REPL. elisp/geiser-doc.el | 11 ++++++----- elisp/geiser-impl.el | 20 ++++++++++++-------- elisp/geiser-repl.el | 8 +++++++- 3 files changed, 25 insertions(+), 14 deletions(-) commit 7196cb2405c2773f394954904b63765fb9f95e8b Author: Jose Antonio Ortega Ruiz Date: Fri Mar 13 01:17:57 2009 +0100 Don't bother asking if there's only one implementation. elisp/geiser-impl.el | 2 +- elisp/geiser-repl.el | 11 +++++++++-- elisp/geiser.el | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) commit 01f1baed879ebcaa5bb5023e9df38ff181610663 Author: Jose Antonio Ortega Ruiz Date: Wed Mar 11 04:14:20 2009 +0100 Better (at least in US keyboards) default key (M-`) for module name completion. README | 4 ++-- elisp/geiser-mode.el | 1 + elisp/geiser-repl.el | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) commit aaab7ec8c08f0fc62cf90119581765b41609ce1b Author: Jose Antonio Ortega Ruiz Date: Wed Mar 11 04:08:42 2009 +0100 Guilisms removed from geiser-repl. elisp/geiser-repl.el | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) commit 24e2adca8be0e5b4f08a3434c29591cba83d73dd Author: Jose Antonio Ortega Ruiz Date: Wed Mar 11 04:06:57 2009 +0100 Support for multiple Scheme implementations, Chapter 2. * The REPL is aware of multiple implementations... * and it knows how to create more than one connection for guile; * but it's not been tested with more than one implementation. * geiser-mode seems to be able to keep track of active REPLs. elisp/geiser-guile.el | 11 ++- elisp/geiser-impl.el | 6 +- elisp/geiser-mode.el | 2 +- elisp/geiser-repl.el | 221 +++++++++++++++++++++++++++++++++------------------ elisp/geiser.el | 24 ++++-- 5 files changed, 173 insertions(+), 91 deletions(-) commit d84fe6278c5bac2e9eb322ecac3e2883dd95d494 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 10 00:10:22 2009 +0100 Reload Geiser libraries in the right order. elisp/geiser-doc.el | 1 - elisp/geiser.el | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) commit eafe05ed39cf33ed8a3dd6d6a875dc2be00a19d2 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 9 23:52:04 2009 +0100 Support for multiple Scheme implementations, Chapter 1. * Evaluation system is now pluggable * The rest of the system understands said pluggability * Guile provides its own implementation (geiser-guile) * The reload system is aware of the new kids on the block elisp/geiser-completion.el | 12 ++-- elisp/geiser-doc.el | 69 ++++++++++-------- elisp/geiser-edit.el | 2 +- elisp/geiser-eval.el | 39 +++++----- elisp/geiser-guile.el | 105 +++++++++++++++++++++++++++ elisp/geiser-impl.el | 176 +++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 12 +++- elisp/geiser-popup.el | 14 ++++ elisp/geiser-repl.el | 7 +- elisp/geiser.el | 15 ++-- scheme/guile/geiser/doc.scm | 3 +- 11 files changed, 391 insertions(+), 63 deletions(-) create mode 100644 elisp/geiser-guile.el create mode 100644 elisp/geiser-impl.el commit baf8e5e99b0650690b16f4bb8ff1dd5736f18a3a Author: Jose Antonio Ortega Ruiz Date: Sat Mar 7 00:07:48 2009 +0100 A bit of key bindings reorg: macro-related commands start with C-cC-m. README | 13 +++++++------ elisp/geiser-mode.el | 9 +++++---- 2 files changed, 12 insertions(+), 10 deletions(-) commit 30ee9fdb4b15dc6a506b16cbc41ae55c7b9e8362 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 23:33:38 2009 +0100 Some tidy up. scheme/guile/geiser/doc.scm | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) commit eda63df7eadd999a4e9234c4bcfcefe62a2bebe6 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 02:49:13 2009 +0100 Small bug fix. scheme/guile/geiser/doc.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 920ab2ad23b50a50ddf366cbffb7b4125f5c6cbb Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 02:34:36 2009 +0100 Refactoring. scheme/guile/geiser/doc.scm | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) commit 1a45bd76c811698b85dc8b47b6fc406b5308473f Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 01:27:39 2009 +0100 Don't display autodoc for function being defined. README | 3 ++- scheme/guile/geiser/doc.scm | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) commit 1f8abf10f7167cacf122a2eaa50acc66f0974d53 Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 00:55:41 2009 +0100 A bit more robust generic methods. README | 2 +- elisp/geiser-mode.el | 2 +- elisp/geiser-xref.el | 11 +++++------ scheme/guile/geiser/xref.scm | 6 +++--- 4 files changed, 10 insertions(+), 11 deletions(-) commit 754aa7a194c412f52b4733142566ed5e33a04f4f Author: Jose Antonio Ortega Ruiz Date: Fri Mar 6 00:47:05 2009 +0100 New command to display generic methods (C-cC-dg) implemented. README | 3 +- elisp/geiser-base.el | 6 ++ elisp/geiser-edit.el | 14 +++-- elisp/geiser-mode.el | 1 + elisp/geiser-xref.el | 132 ++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser.el | 1 + scheme/guile/geiser/xref.scm | 3 +- 7 files changed, 152 insertions(+), 8 deletions(-) create mode 100644 elisp/geiser-xref.el commit 9e91cef8b3d10e7eab88cc16d425fefc36c7321d Author: Jose Antonio Ortega Ruiz Date: Thu Mar 5 22:53:47 2009 +0100 turn-on/off-geiser-mode commands added and used in scheme-mode-hook. elisp/geiser-autodoc.el | 2 +- elisp/geiser-mode.el | 10 ++++++++++ elisp/geiser.el | 8 +++++++- scheme/guile/geiser/doc.scm | 4 ++-- 4 files changed, 20 insertions(+), 4 deletions(-) commit efe21b1337f02095cf40791f8b0c237ae56c39a0 Author: Jose Antonio Ortega Ruiz Date: Thu Mar 5 02:19:42 2009 +0100 They say call/cc is slow in Guile. scheme/guile/geiser/modules.scm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) commit 692eb942c39fd42ffe61f1408a4998d738c88933 Author: Jose Antonio Ortega Ruiz Date: Thu Mar 5 02:14:01 2009 +0100 generic-methods implemented in scheme (no emacs side yet). scheme/guile/geiser/doc.scm | 7 ++++++- scheme/guile/geiser/xref.scm | 30 +++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) commit f1e7cfe8f0417ed636aca5d17706ea8e91375241 Author: Jose Antonio Ortega Ruiz Date: Wed Mar 4 21:22:11 2009 +0100 Leave quasiquote alone in autodoc. elisp/geiser-repl.el | 5 ++--- scheme/guile/geiser/doc.scm | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) commit 902b7685194e9adfcd19d518a45dae3c4b13a90b Author: Jose Antonio Ortega Ruiz Date: Wed Mar 4 02:07:41 2009 +0100 New geiser-reload command. New geiser command. README | 2 ++ elisp/geiser-debug.el | 1 - elisp/geiser-mode.el | 11 +++++++++ elisp/geiser-repl.el | 18 +++++++++++++-- elisp/geiser.el | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 3 deletions(-) commit a4b7db53db0d05b8a39c263715a296d64b4f64f4 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 3 22:39:26 2009 +0100 Cache arguments parsed from documentation; don't treat quasiquote as a function. scheme/guile/geiser/doc.scm | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) commit f09c34f2749d223760654d3b5d0934a042d176b1 Author: Jose Antonio Ortega Ruiz Date: Tue Mar 3 01:05:12 2009 +0100 Highlight also #:key in autodoc. elisp/geiser-autodoc.el | 15 +++++++++++---- elisp/geiser-syntax.el | 6 ++++-- 2 files changed, 15 insertions(+), 6 deletions(-) commit ef1fcb91a47ef570f71b240aaf2a6ec529c9eb6e Author: Jose Antonio Ortega Ruiz Date: Tue Mar 3 00:36:08 2009 +0100 Micro-optimisation. elisp/geiser-autodoc.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) commit d2afd2b7f9f793962dd0f949461851ae8be2649b Author: Jose Antonio Ortega Ruiz Date: Tue Mar 3 00:02:36 2009 +0100 Fix autodoc support for multiline arities in documentation. scheme/guile/geiser/doc.scm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) commit 95e744b614398b2955143121e7b5da5748e833ee Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 23:01:17 2009 +0100 Autodoc enhancements: * Use argument names from guile-procedures.txt when available. * Highlihgt #:opt with a face of its own. elisp/geiser-autodoc.el | 16 ++++++++++++---- elisp/geiser-repl.el | 4 ++-- elisp/geiser-syntax.el | 12 +++++++----- scheme/guile/geiser/doc.scm | 31 +++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 11 deletions(-) commit 3124c25768b107233497acc009e378bd6a044339 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 19:12:37 2009 +0100 Correctly specify current module in REPL (and make it generic). elisp/geiser-eval.el | 15 ++++++++++++++- elisp/geiser-repl.el | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) commit 02208b6423a33ff28540c27cf3dca678e8a77b7a Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 16:19:49 2009 +0100 Fix recursive require. Nicer arg names in autodoc. elisp/geiser-repl.el | 1 - scheme/guile/geiser/doc.scm | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) commit 1f80c5048e78d0251c18634b8bf7d3f8ea4733b0 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 03:13:59 2009 +0100 Breakdown of schemeland into neat submodules. scheme/guile/geiser/completion.scm | 56 +++++++ scheme/guile/geiser/doc.scm | 183 +++++++++++++++++++++ scheme/guile/geiser/emacs.scm | 128 ++------------- scheme/guile/geiser/evaluation.scm | 144 +++++++++++++++++ scheme/guile/geiser/introspection.scm | 298 ----------------------------------- scheme/guile/geiser/modules.scm | 102 ++++++++++++ scheme/guile/geiser/utils.scm | 53 +++++++ scheme/guile/geiser/xref.scm | 37 +++++ 8 files changed, 587 insertions(+), 414 deletions(-) create mode 100644 scheme/guile/geiser/completion.scm create mode 100644 scheme/guile/geiser/doc.scm create mode 100644 scheme/guile/geiser/evaluation.scm delete mode 100644 scheme/guile/geiser/introspection.scm create mode 100644 scheme/guile/geiser/modules.scm create mode 100644 scheme/guile/geiser/utils.scm create mode 100644 scheme/guile/geiser/xref.scm commit ab27ee71db711b8295dfb6e9f89d059d2310cc5e Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 01:45:04 2009 +0100 Tiny refactoring. elisp/geiser-syntax.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 001534d64dd74fd0977c2c4421fe029b7a8f62e7 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 01:24:16 2009 +0100 Correctly detecting first occurrences of methods in M-. elisp/geiser-edit.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) commit 2896240921784f0b7f6b9bcf1c658024c9d9dc25 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 01:06:14 2009 +0100 Fix (again!) completion for symbols outside enclosing forms. elisp/geiser-autodoc.el | 2 +- elisp/geiser-syntax.el | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) commit 97d1170d4170933a317782dbf353eddf41f09802 Author: Jose Antonio Ortega Ruiz Date: Mon Mar 2 00:29:55 2009 +0100 Autodoc support for GOOPS methods. scheme/guile/geiser/introspection.scm | 91 ++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 35 deletions(-) commit 28e79842fd87689187834a2c4186b5e2ac294fe6 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 20:40:22 2009 +0100 Macro-expand commands. README | 55 ++++++++++++++++++++++++-------------------- elisp/geiser-debug.el | 13 +++++++++++ elisp/geiser-mode.el | 27 ++++++++++++++++++++-- scheme/guile/geiser/emacs.scm | 5 +++- 4 files changed, 72 insertions(+), 28 deletions(-) commit c5d4a2b6670a9f3ce8b357ef5f4cab72eb211102 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 20:06:18 2009 +0100 Refactoring the refactoring. elisp/geiser-debug.el | 9 ++++++++- elisp/geiser-eval.el | 10 ---------- 2 files changed, 8 insertions(+), 11 deletions(-) commit af150090685e5e456bc0788fb45703b6eace053d Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 16:41:09 2009 +0100 Some refactoring and new ge:macroexpand. elisp/geiser-debug.el | 7 +++++++ elisp/geiser-eval.el | 10 ++++++++++ elisp/geiser-mode.el | 21 +++------------------ scheme/guile/geiser/emacs.scm | 5 +++++ 4 files changed, 25 insertions(+), 18 deletions(-) commit 3990c6476ab7cee03f4bf89827df7a23adf4d794 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 15:51:09 2009 +0100 Completions buffer renamed to *Geiser completions*. elisp/geiser-completion.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 18e0a6a3fdad52f4f30e9190b97b64211595e4d0 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 15:49:34 2009 +0100 Bug fix. scheme/guile/geiser/introspection.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit b03485cff434d8a2eafd8ad02620293a35c01977 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 02:19:41 2009 +0100 More precise argument position highlighting in autodoc. elisp/geiser-syntax.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) commit e9a5923201d09f13b522ccc769bcafbdd11e15c2 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 01:13:33 2009 +0100 Completion for symbols without enclosing sexp in scheme buffers. elisp/geiser-completion.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) commit 1376e6ca4919396ff94c78374d816f86556f395e Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 01:09:16 2009 +0100 Fix for autodoc when point in a rest formal arg in define. elisp/geiser-syntax.el | 2 +- scheme/guile/geiser/introspection.scm | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) commit 04652644b47528d0a3ab00c6475a6752e7a1dbb5 Author: Jose Antonio Ortega Ruiz Date: Sun Mar 1 00:41:08 2009 +0100 Miscellaneous little fixes. elisp/geiser-autodoc.el | 5 ++++- elisp/geiser-completion.el | 5 ++--- scheme/guile/geiser/introspection.scm | 24 +++++++++++++++--------- 3 files changed, 21 insertions(+), 13 deletions(-) commit 7eb84295087a0d531e8694abf0ecc65c86ec5c34 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 23:03:53 2009 +0100 Display (quote foo) as 'foo in autodoc strings. elisp/geiser-autodoc.el | 10 +++++----- scheme/guile/geiser/introspection.scm | 5 ----- 2 files changed, 5 insertions(+), 10 deletions(-) commit 034b3070c61888a0e88edd33506c58fdae9b2115 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 17:16:20 2009 +0100 Refactoring: local bindings discovery moved to schemeland. elisp/geiser-autodoc.el | 2 +- elisp/geiser-completion.el | 8 +++++- elisp/geiser-syntax.el | 53 +++++++++++------------------------- scheme/guile/geiser/introspection.scm | 31 ++++++++++++++++++--- 4 files changed, 51 insertions(+), 43 deletions(-) commit 77253da86ac2d005a0802426c7ebe08bf8dca9ce Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 14:19:48 2009 +0100 Fix scanning partial sexps in presence of quotations &co. elisp/geiser-syntax.el | 4 ++++ 1 file changed, 4 insertions(+) commit e78b749e34c2f6e681f815d0b9b9dd3d32537c88 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 04:35:45 2009 +0100 Simpler handling of rest args in Emacs' side. elisp/geiser-autodoc.el | 33 +++++++++++---------------------- elisp/geiser-doc.el | 11 ++++++++--- elisp/geiser-repl.el | 4 ++-- scheme/guile/geiser/introspection.scm | 4 ++-- 4 files changed, 23 insertions(+), 29 deletions(-) commit adf746b37d1ffa35abe99eb3ae2b85902e8781ce Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 02:08:01 2009 +0100 Autodoc working in the REPL (again). elisp/geiser-repl.el | 8 ++++++++ 1 file changed, 8 insertions(+) commit d1fb61738e38b71114d85e8f4f5205908637715b Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 01:59:05 2009 +0100 Persistent REPL history. elisp/geiser-repl.el | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) commit 08a8a4e16a7590d2c3517d8330ff0cb76d81792c Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 00:44:31 2009 +0100 Delete, don't kill, region. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 12aef24d0084a3739e9433b10398304261074066 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 28 00:42:42 2009 +0100 Put new procedure-arguments into (geiser introspection) until it goes upstream. scheme/guile/geiser/introspection.scm | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) commit 20811cf28fd0496acbd2d3fe9050d8c9892470a7 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 27 23:59:55 2009 +0100 Font lock for autodoc's function name. elisp/geiser-autodoc.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) commit 3d0d1ce42229a8e6cd62d1a1c8f9b1c4c104293a Author: Jose Antonio Ortega Ruiz Date: Fri Feb 27 23:29:09 2009 +0100 Autodoc system revamped. elisp/geiser-autodoc.el | 87 +++++++++++++------------- elisp/geiser-syntax.el | 90 ++++++++++---------------- scheme/guile/geiser/emacs.scm | 2 +- scheme/guile/geiser/introspection.scm | 118 +++++++++++++++++------------------ 4 files changed, 136 insertions(+), 161 deletions(-) commit 8337756109d12349b220ba422f148555a2d031c2 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 26 12:00:12 2009 +0100 Eval/load file in the correct module. scheme/guile/geiser/emacs.scm | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) commit eb2563843e3d2843da838f87f5bc32dcf9b47757 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 25 21:46:08 2009 +0100 Variable controlling geiser-autodoc-mode in REPL (on by default). elisp/geiser-custom.el | 2 +- elisp/geiser-repl.el | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) commit 3984c0691404a2c85ad398def1228d13f2fa480a Author: Jose Antonio Ortega Ruiz Date: Wed Feb 25 02:08:08 2009 +0100 Autoloads for customization groups. README | 9 ++++++--- elisp/geiser.el | 5 +++++ 2 files changed, 11 insertions(+), 3 deletions(-) commit 4dad19b83074091cd18bb1561ffed5011e51ee5a Author: Jose Antonio Ortega Ruiz Date: Wed Feb 25 01:23:22 2009 +0100 Missing require. elisp/geiser-mode.el | 1 + 1 file changed, 1 insertion(+) commit 726c5d5bfe9d86523376965ea7a371deccab6d07 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 25 01:08:29 2009 +0100 Fix for smart-tab-mode. elisp/geiser-completion.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit f59c052de6781566baf674c59531478cdc0fddf4 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 25 01:02:25 2009 +0100 Missing require. elisp/geiser-base.el | 1 + 1 file changed, 1 insertion(+) commit b9b36421ff83a12b1ef9e645be7d23f68d703912 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 24 23:23:58 2009 +0100 Smart tab is not enabled by default; module completion bound to C-. README | 25 +++++++++++-------------- elisp/geiser-completion.el | 6 ++---- elisp/geiser-debug.el | 18 +++++++++++------- elisp/geiser-mode.el | 5 +++-- elisp/geiser-repl.el | 3 ++- 5 files changed, 29 insertions(+), 28 deletions(-) commit 05c2c94f9a29e24139c591d994a225d9de416767 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 24 10:40:55 2009 +0100 Spurious geiser-debug-mode key mode map deleted. elisp/geiser-debug.el | 9 --------- 1 file changed, 9 deletions(-) commit 65633c9b1be28e4a0bc6bc37ec8cccef33cc0a92 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 24 10:38:46 2009 +0100 Compilation mode working on dbg buffers. elisp/geiser-debug.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) commit 641449ca6073648d5722d1a552d3a5245d523e48 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 24 02:18:28 2009 +0100 Partial support for stack trace display. elisp/geiser-autodoc.el | 57 ++++++++++----------- elisp/geiser-compile.el | 34 ++----------- elisp/geiser-debug.el | 96 ++++++++++++++++++++++++++++++++++++ elisp/geiser-eval.el | 1 + elisp/geiser-mode.el | 17 +------ scheme/guile/geiser/emacs.scm | 40 +++++++++++++-- scheme/guile/geiser/introspection.scm | 15 +++--- 7 files changed, 175 insertions(+), 85 deletions(-) create mode 100644 elisp/geiser-debug.el commit abe0355b7eb7961c89ef2e37f68451b131dacb05 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 04:46:14 2009 +0100 Correct stack in load/compile file retorts. elisp/geiser-compile.el | 8 ++++---- elisp/geiser-eval.el | 8 ++++++++ scheme/guile/geiser/emacs.scm | 8 +++++--- 3 files changed, 17 insertions(+), 7 deletions(-) commit 612c7390fc3ff78ac9b0b10b83304095cfceccd5 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 04:22:07 2009 +0100 Better stack delimitation: include only frames relevant to the eval'd expression. scheme/guile/geiser/emacs.scm | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) commit a585a046ddc523cb69977c856f3386d8bb65c325 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 02:45:30 2009 +0100 Capture backtrace. Fix load/compile from Emacs. elisp/geiser-compile.el | 2 +- scheme/guile/geiser/emacs.scm | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) commit b85a85fb3c6445f7b1d9291b019acd03ad4dabd4 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 00:59:57 2009 +0100 Refactoring of the eval/compile procedures. scheme/guile/geiser/emacs.scm | 46 +++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) commit 4437f8d08a03e83e425742565f532cc0f5e768c8 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 21 00:01:27 2009 +0100 Offer also local bindings as possible completions in M-TAB. elisp/geiser-completion.el | 3 ++- elisp/geiser-syntax.el | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) commit 5d6dd6f7e7c9f8abddfc59acf3f3318f594afb22 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 20 20:55:39 2009 +0100 Play nice with (ice-9 history) by using WRITE to return values to Emacs. scheme/guile/geiser/emacs.scm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) commit a295bf5b45e3e1a38516120af0fa60d6594d7083 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 20 02:02:56 2009 +0100 Allow loading of a initialisation file (akin to ~/.guile, named ~/.guile-geiser by default). elisp/geiser-repl.el | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) commit 327f1431a235a10a0d0a685fcf1fe26bf3973ffa Author: Jose Antonio Ortega Ruiz Date: Wed Feb 18 12:59:41 2009 +0100 (geiser eval) functionality moved to (geiser emacs). README | 2 +- elisp/geiser-eval.el | 4 +- scheme/guile/geiser/emacs.scm | 82 +++++++++++++++++++++++++++++++--- scheme/guile/geiser/eval.scm | 102 ------------------------------------------- 4 files changed, 78 insertions(+), 112 deletions(-) delete mode 100644 scheme/guile/geiser/eval.scm commit 606ebcefb7ccc160f3dd9583685d30345b2d95b6 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 17 21:56:23 2009 +0100 Document browser improvements: history and links. README | 15 ++++ elisp/geiser-doc.el | 209 +++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 200 insertions(+), 24 deletions(-) commit 9f744aa5e4e032cfe413673fa7e875ab16ce8600 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 17 16:11:33 2009 +0100 Fix in symbol help signature displaying. scheme/guile/geiser/introspection.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 02b4dbe81d4662aaf207677c53b869cc055b06a3 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 17 01:31:26 2009 +0100 Better symbol documentation. elisp/geiser-doc.el | 11 +++++--- scheme/guile/geiser/emacs.scm | 2 +- scheme/guile/geiser/introspection.scm | 54 ++++++++++++++++++------------------ 3 files changed, 35 insertions(+), 32 deletions(-) commit 6e89d965f1b0a8329ddc012feb36fd43c591acbf Author: Jose Antonio Ortega Ruiz Date: Tue Feb 17 00:44:11 2009 +0100 Separate commands for evaluation and compilation. elisp/geiser-autodoc.el | 7 +++-- elisp/geiser-compile.el | 2 +- elisp/geiser-completion.el | 6 ++-- elisp/geiser-doc.el | 4 +-- elisp/geiser-edit.el | 6 ++-- elisp/geiser-eval.el | 28 +++++++++++------ elisp/geiser-mode.el | 77 ++++++++++++++++++++++++++++----------------- elisp/geiser-syntax.el | 4 ++- scheme/guile/geiser/eval.scm | 33 ++++++++++++++++--- 9 files changed, 111 insertions(+), 56 deletions(-) commit 41d54012368ca33461fe3e8668c2b0e3052af3b8 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 16 22:21:28 2009 +0100 New command to open module file. README | 39 ++++++++++++++++++------------------ elisp/geiser-edit.el | 16 ++++++++++----- elisp/geiser-eval.el | 3 ++- elisp/geiser-mode.el | 3 ++- elisp/geiser-syntax.el | 5 ++--- scheme/guile/geiser/emacs.scm | 3 ++- scheme/guile/geiser/eval.scm | 6 ++++-- scheme/guile/geiser/introspection.scm | 11 +++++----- 8 files changed, 49 insertions(+), 37 deletions(-) commit fbc65dfc767da1dc3b28262eae041e9d303752c2 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 16 00:46:31 2009 +0100 New command: module documentation. README | 8 ++++--- elisp/geiser-autodoc.el | 2 +- elisp/geiser-completion.el | 15 +++++++------ elisp/geiser-custom.el | 11 +++++----- elisp/geiser-doc.el | 52 ++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 9 ++++++-- elisp/geiser-repl.el | 1 + scheme/guile/geiser/emacs.scm | 3 ++- 8 files changed, 82 insertions(+), 19 deletions(-) commit ecf460e9aca83a32bb1149ecd5b0238c7a5cb233 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 21:39:02 2009 +0100 Nits. elisp/geiser-syntax.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit e7b2ec5d5d2e9f57840ab08adbbce03ccff48956 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 19:54:14 2009 +0100 Avoing REPL modeline message flickering on redirection. elisp/geiser-connection.el | 16 ++++++++++------ elisp/geiser-repl.el | 7 +++++-- 2 files changed, 15 insertions(+), 8 deletions(-) commit 1af411071098d87188a6a479dd6741c65034de62 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 19:00:15 2009 +0100 Compile command adapted to new compiled-file-name behaviour. scheme/guile/geiser/eval.scm | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) commit bc1b0658370808d53cfd4e485911802bc498f626 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 18:41:04 2009 +0100 Smart tab completion mode. README | 14 ++++++++++++-- elisp/geiser-completion.el | 37 +++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 13 ++++++++++--- elisp/geiser-repl.el | 3 +-- 4 files changed, 60 insertions(+), 7 deletions(-) commit 245e681f8ebd0f9304ae87815bf1d49a05241162 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 17:35:17 2009 +0100 Initial support for module name completion. README | 2 + elisp/geiser-completion.el | 90 +++++++++++++++++------------------- elisp/geiser-repl.el | 2 + scheme/guile/geiser/emacs.scm | 3 +- scheme/guile/geiser/introspection.scm | 69 +++++++++++++++++++++++++-- 5 files changed, 113 insertions(+), 53 deletions(-) commit f753d35c186ad448e70e84afbc91fb37db2fbb57 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 01:32:31 2009 +0100 Recognise empty doc string in Emacs side. Small refactorings. elisp/geiser-doc.el | 4 ++-- scheme/guile/geiser/introspection.scm | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) commit 6fab966acd979bedcd12adacc793999e459cac52 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 15 01:22:29 2009 +0100 Better docstring. scheme/guile/geiser/introspection.scm | 69 ++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 22 deletions(-) commit 71114ab18c51729b54b05ab08316fd1eb4faf56f Author: Jose Antonio Ortega Ruiz Date: Sat Feb 14 22:52:44 2009 +0100 Fleshing out the README. README | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) commit 1d8477f7cd318b5692e5650901ac5ac9af6f19c6 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 14 22:15:09 2009 +0100 Autodoc: try symbol at point first. Some cleanups. elisp/geiser-autodoc.el | 9 ++---- elisp/geiser-base.el | 7 ----- elisp/geiser-custom.el | 57 ++++++++++++++++++++++++++++++++++++ elisp/geiser-edit.el | 3 +- elisp/geiser-mode.el | 1 + elisp/geiser-repl.el | 13 ++++---- elisp/geiser-syntax.el | 8 ++--- scheme/guile/geiser/introspection.scm | 4 ++- 8 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 elisp/geiser-custom.el commit 5ee2ae3ccd73f5dfae68db011c581f918eea8751 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 14 20:52:27 2009 +0100 New command to get docstrings (C-cC-d). elisp/geiser-completion.el | 4 ++- elisp/geiser-doc.el | 63 ++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 2 ++ elisp/geiser-repl.el | 1 + scheme/guile/geiser/emacs.scm | 3 +- scheme/guile/geiser/introspection.scm | 5 +++ 6 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 elisp/geiser-doc.el commit 13d84e514446438f0115585f3a14e36f535e2225 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 14 14:07:08 2009 +0100 Small autodoc fixes. elisp/geiser-autodoc.el | 24 +++++++++++++----------- scheme/guile/geiser/introspection.scm | 16 +++++++++------- 2 files changed, 22 insertions(+), 18 deletions(-) commit 9cfc4087722156e3cb53e425b2f81fd118844d14 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 13 20:23:43 2009 +0100 Small improvements. elisp/geiser-autodoc.el | 2 +- elisp/geiser-compile.el | 3 +-- elisp/geiser-edit.el | 2 +- elisp/geiser-syntax.el | 11 ++++++----- scheme/guile/geiser/introspection.scm | 4 +--- 5 files changed, 10 insertions(+), 12 deletions(-) commit 62d18ab50a048f83d4a67c9f241e6e725fc32528 Author: Jose Antonio Ortega Ruiz Date: Fri Feb 13 01:11:10 2009 +0100 Inconsequential refactorings. scheme/guile/geiser/introspection.scm | 43 ++++++++++++------------------------ 1 file changed, 14 insertions(+), 29 deletions(-) commit 1369b62d71e06735a3e4d2b8349cfffe6de12a6c Author: Jose Antonio Ortega Ruiz Date: Fri Feb 13 00:54:26 2009 +0100 Faster, asynchronous autodoc. elisp/geiser-autodoc.el | 38 +++++++++++++++++++++++------------- scheme/guile/geiser/emacs.scm | 2 +- scheme/guile/geiser/introspection.scm | 10 ++++++++-- 3 files changed, 33 insertions(+), 17 deletions(-) commit 432e405274205c91784456449f344044c8d62e48 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 12 23:33:58 2009 +0100 Better arg lists. elisp/geiser-edit.el | 7 +++++-- scheme/guile/geiser/introspection.scm | 38 ++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 15 deletions(-) commit 09c532a18d33ab2e0a3dcb3a38e746992e3381aa Author: Jose Antonio Ortega Ruiz Date: Thu Feb 12 22:47:34 2009 +0100 Faster M-. elisp/geiser-edit.el | 7 ++++--- scheme/guile/geiser/introspection.scm | 6 ++---- 2 files changed, 6 insertions(+), 7 deletions(-) commit fa17e0cb3367e68e8db386497ddcfe3cfcf96416 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 12 22:34:51 2009 +0100 M-. working for any symbol whose module can be located. scheme/guile/geiser/introspection.scm | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) commit 0ead55f7052edb0f151e4e86c6feb30718d36bea Author: Jose Antonio Ortega Ruiz Date: Thu Feb 12 22:07:29 2009 +0100 Edit symbol at point for programs. .gitignore | 1 + elisp/geiser-compile.el | 3 +- elisp/geiser-edit.el | 116 +++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 3 + elisp/geiser-repl.el | 6 +- elisp/geiser-syntax.el | 2 - scheme/guile/geiser/emacs.scm | 1 + scheme/guile/geiser/eval.scm | 4 +- scheme/guile/geiser/introspection.scm | 38 ++++++++++-- 9 files changed, 162 insertions(+), 12 deletions(-) create mode 100644 elisp/geiser-edit.el commit f7dc963dd7c6df1490ff792b6a45bd8f8ffea71e Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 20:56:58 2009 +0100 Don't let (ice-9 history) confuse the evaluator. elisp/geiser-connection.el | 1 - elisp/geiser-syntax.el | 5 ++++- scheme/guile/geiser/introspection.scm | 31 ++++++++++++++++++++----------- 3 files changed, 24 insertions(+), 13 deletions(-) commit 1a9da365fc52aa15300e03bb14aa4af5b9f47c6a Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 12:45:22 2009 +0100 README stuff. .gitignore | 1 + README | 11 +++++++++++ elisp/geiser-compile.el | 2 +- scheme/guile/geiser/emacs.scm | 1 - scheme/guile/geiser/introspection.scm | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) commit e4c958fe1e5bad829e08dbce31f1a23e458ebd6b Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 10:47:12 2009 +0100 Load file commands. elisp/geiser-compile.el | 80 ++++++++++++++++++++++++++++++-------------- elisp/geiser-mode.el | 12 ++++--- elisp/geiser-repl.el | 1 + scheme/guile/geiser/emacs.scm | 6 ++-- scheme/guile/geiser/eval.scm | 11 +++--- 5 files changed, 75 insertions(+), 35 deletions(-) commit 2b2355b6134f5068dfff424f8fda32ae0236a516 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 01:41:53 2009 +0100 * scheme/guile/geiser/eval.scm: missing file in previous commit scheme/guile/geiser/eval.scm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) commit 6edd43a2b5250cee8f46bacf7c0d799422fae213 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 01:40:59 2009 +0100 * scheme/guile/geiser/eval.scm: load file after compilation. .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore commit ba13256d20ce53c7a35092ae2d23debe64c764a5 Author: Jose Antonio Ortega Ruiz Date: Wed Feb 11 01:32:14 2009 +0100 Compile file. elisp/geiser-base.el | 3 ++ elisp/geiser-compile.el | 77 +++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 3 +- elisp/geiser-repl.el | 5 +-- scheme/guile/geiser/eval.scm | 11 +++++-- 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 elisp/geiser-compile.el commit e48d59af292ca82e77733070cf3444ac2e0ba7df Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 23:33:21 2009 +0100 Guile scheme files moved to scheme/guile. elisp/geiser-eval.el | 5 ++- elisp/geiser-repl.el | 2 +- scheme/geiser/emacs.scm | 32 --------------- scheme/geiser/eval.scm | 65 ----------------------------- scheme/geiser/introspection.scm | 79 ------------------------------------ scheme/guile/geiser/emacs.scm | 37 +++++++++++++++++ scheme/guile/geiser/eval.scm | 69 +++++++++++++++++++++++++++++++ scheme/guile/geiser/introspection.scm | 79 ++++++++++++++++++++++++++++++++++++ 8 files changed, 190 insertions(+), 178 deletions(-) delete mode 100644 scheme/geiser/emacs.scm delete mode 100644 scheme/geiser/eval.scm delete mode 100644 scheme/geiser/introspection.scm create mode 100644 scheme/guile/geiser/emacs.scm create mode 100644 scheme/guile/geiser/eval.scm create mode 100644 scheme/guile/geiser/introspection.scm commit 6bc5dce3118a78e2665bbf981dc61866329269c1 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 17:11:45 2009 +0100 Multi-level form arity recognition in autodoc. elisp/geiser-autodoc.el | 28 ++++++++++++++++------------ elisp/geiser-syntax.el | 22 +++++++++++++--------- 2 files changed, 29 insertions(+), 21 deletions(-) commit 710d1f8be59066f0b52d07b0f43343b3ab671ffa Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 15:12:31 2009 +0100 Sort completion list in scheme's side. elisp/geiser-completion.el | 7 +++---- elisp/geiser-eval.el | 13 ++++++++----- scheme/geiser/introspection.scm | 11 +++++++---- 3 files changed, 18 insertions(+), 13 deletions(-) commit 8b2b6e02b5a7ceaf7b6f91dd302a42141c4ade8a Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 01:24:45 2009 +0100 Small fix for '() argument position reporting. elisp/geiser-syntax.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 052e7fb476f018e1426e1bd9394d4fe63db33f45 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 01:08:04 2009 +0100 Optionally show procedure modules in autodoc. elisp/geiser-autodoc.el | 15 ++++++++++++++- scheme/geiser/introspection.scm | 19 +++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) commit 0490e6d2047aa97be3a0b3e34075557666336679 Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 00:06:38 2009 +0100 Better args reporting for macros. scheme/geiser/introspection.scm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) commit 21ab330125c16075df2ed0168ee3dedf39dd43bd Author: Jose Antonio Ortega Ruiz Date: Tue Feb 10 00:06:20 2009 +0100 EVAL-IN: compile code in the correct module. scheme/geiser/eval.scm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) commit c225b4606809739b6d408c915694841ca1aa45c0 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 23:33:24 2009 +0100 TAB-completion for symbols in Scheme and REPL buffers. elisp/geiser-completion.el | 225 +++++++++++++++++++++++++++++++++++++++++ elisp/geiser-mode.el | 2 + elisp/geiser-repl.el | 3 +- scheme/geiser/emacs.scm | 2 +- scheme/geiser/introspection.scm | 6 +- 5 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 elisp/geiser-completion.el commit cb1c7c38f4dbc5af1e4fed7cb9e01897a2cf458e Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 22:00:20 2009 +0100 GEISER-SETUP function activating geiser-mode in scheme files. elisp/geiser.el | 10 ++++++++++ 1 file changed, 10 insertions(+) commit aacdd11a8816430e6bdd2704c52e07466f0cca19 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 21:59:23 2009 +0100 Better preparation of Scheme results for the Elisp reader. elisp/geiser-connection.el | 9 ++------- elisp/geiser-syntax.el | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) commit 99c436f18a37a665156f130ab7de720b37c8cf90 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 21:58:10 2009 +0100 Better bindings for M-p, M-n in geiser repl. elisp/geiser-repl.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) commit 1099d5bb6da7b6d03f2f5a4f70d0a8c4bec5ceac Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 12:32:30 2009 +0100 Don't echo any autodoc info when arity is not available. elisp/geiser-autodoc.el | 9 +++++---- elisp/geiser-syntax.el | 17 ++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) commit 6f7e0e15ac672b13efce7be815d4c550d3ecdf16 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 12:14:04 2009 +0100 Better argument position detection in autodoc. elisp/geiser-syntax.el | 18 ++++++++++++------ scheme/geiser/introspection.scm | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) commit 4e7c148fef58281345c1d4d0815732e27977da71 Author: Jose Antonio Ortega Ruiz Date: Mon Feb 9 01:29:26 2009 +0100 Basic region/definition/sexp evaluation and autodoc mode working. elisp/geiser-autodoc.el | 132 +++++++++++++++++++++++++++++++++++ elisp/geiser-eval.el | 27 +++---- elisp/geiser-mode.el | 155 +++++++++++++++++++++++++++++++++++++++++ elisp/geiser-syntax.el | 96 +++++++++++++++++++++++++ elisp/geiser.el | 7 +- scheme/geiser/emacs.scm | 32 +++++++++ scheme/geiser/eval.scm | 16 +++-- scheme/geiser/introspection.scm | 65 +++++++++++++++++ 8 files changed, 509 insertions(+), 21 deletions(-) create mode 100644 elisp/geiser-autodoc.el create mode 100644 elisp/geiser-mode.el create mode 100644 elisp/geiser-syntax.el create mode 100644 scheme/geiser/emacs.scm create mode 100644 scheme/geiser/introspection.scm commit e16e29baa9d444be4fd5e60f93c124c666c60b80 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 8 14:16:05 2009 +0100 Capturing output of scheme evaluations elisp/geiser-eval.el | 1 + scheme/geiser/eval.scm | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) commit 3670817dcc482c75105da7965e7306044171b0d9 Author: Jose Antonio Ortega Ruiz Date: Sun Feb 8 12:47:42 2009 +0100 Fixes for Elisp/Scheme translations. elisp/geiser-connection.el | 10 ++++++++-- elisp/geiser-eval.el | 15 +++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) commit 0935e89110296b884d06141b5b4386122f18403e Author: Jose Antonio Ortega Ruiz Date: Sun Feb 8 11:56:30 2009 +0100 Better error presentation. elisp/geiser-eval.el | 7 ++++++- scheme/geiser/eval.scm | 22 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) commit 377d6d19debce5572052727323931f1b8306226b Author: Jose Antonio Ortega Ruiz Date: Sun Feb 8 01:09:07 2009 +0100 Basic Guile/Emacs connection and evaluation working. elisp/geiser-connection.el | 245 ++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-eval.el | 112 +++++++++++++++++++++ elisp/geiser-repl.el | 113 +++++++++++++++++++++ scheme/geiser/eval.scm | 42 ++++++++ 4 files changed, 512 insertions(+) create mode 100644 elisp/geiser-connection.el create mode 100644 elisp/geiser-eval.el create mode 100644 scheme/geiser/eval.scm commit 9b4016cd9bce8354ac3eede20345e83db8c65b94 Author: Jose Antonio Ortega Ruiz Date: Sat Feb 7 16:08:42 2009 +0100 Elisp utilities (mostly imported from FUEL). elisp/geiser-base.el | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-log.el | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-popup.el | 88 ++++++++++++++++++++++++++++++++++++++++++++++ elisp/geiser-repl.el | 40 +++++++++++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 elisp/geiser-base.el create mode 100644 elisp/geiser-log.el create mode 100644 elisp/geiser-popup.el create mode 100644 elisp/geiser-repl.el commit 5c83238aa002a0590bd42f37a3344fda24ca547a Author: Jose Antonio Ortega Ruiz Date: Thu Feb 5 23:50:13 2009 +0100 Emacs startup file elisp/geiser.el | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 elisp/geiser.el commit 22542ce5b9ad5c9e25806f5d42cb33c6ae47f66c Author: Jose Antonio Ortega Ruiz Date: Thu Feb 5 23:49:11 2009 +0100 License file COPYING | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 COPYING commit e6824bec1687492c9767b629bfb118b896a74f68 Author: Jose Antonio Ortega Ruiz Date: Thu Feb 5 22:41:22 2009 +0100 It all begins with an empty tree README | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README geiser-0.8.1/doc/0000755000175000017500000000000012607252047010551 500000000000000geiser-0.8.1/doc/geiser.texi0000644000175000017500000000437312466043377012660 00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename geiser.info @settitle Geiser User Manual @c %**end of header @include macros.texi @copying This manual documents Geiser, an Emacs environment to hack in Scheme. Copyright @copyright{} 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available from the Free Software Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}. @end quotation The document was typeset with @uref{http://www.gnu.org/software/texinfo/index.html, GNU Texinfo}. @end copying @dircategory Emacs @direntry * Geiser: (geiser). Emacs environment for Scheme hacking. @end direntry @titlepage @title Geiser User Manual @subtitle Emacs and Scheme talk to each other @author Jose Antonio Ortega Ruiz @page @vskip 0pt plus 1filll @insertcopying @end titlepage @c Output the table of the contents at the beginning. @contents @ifnottex @node Top, Introduction, (dir), (dir) @top Geiser @insertcopying @menu * Introduction:: * Installation:: * The REPL:: * Between the parens:: * Cheat sheet:: * No hacker is an island:: * Index:: @detailmenu --- The Detailed Node Listing --- Introduction * Modus operandi:: * Showing off:: Installation * Must needs:: * The easy and quick way:: * From the source's mouth:: * Friends:: The REPL * Starting the REPL:: * First aids:: * Switching context:: * Completion and error handling:: * Autodoc and friends:: * Seeing is believing:: * Customization and tips:: Between the parens * Activating Geiser:: * The source and the REPL:: * Documentation helpers:: * To eval or not to eval:: * To err perchance to debug:: * Jumping around:: * Geiser writes for you:: Cheat sheet * Scheme buffers:: * REPL:: * Documentation browser:: @end detailmenu @end menu @include top.texi @end ifnottex @include intro.texi @include install.texi @include repl.texi @include parens.texi @include cheat.texi @include thanks.texi @include index.texi @bye @c geiser.texinfo ends here geiser-0.8.1/doc/geiser.info0000644000175000017500000024502112607252026012625 00000000000000This is geiser.info, produced by makeinfo version 6.0 from geiser.texi. This manual documents Geiser, an Emacs environment to hack in Scheme. Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available from the Free Software Foundation Web site at . The document was typeset with GNU Texinfo (http://www.gnu.org/software/texinfo/index.html). INFO-DIR-SECTION Emacs START-INFO-DIR-ENTRY * Geiser: (geiser). Emacs environment for Scheme hacking. END-INFO-DIR-ENTRY  File: geiser.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) Geiser ****** This manual documents Geiser, an Emacs environment to hack in Scheme. Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is available from the Free Software Foundation Web site at . The document was typeset with GNU Texinfo (http://www.gnu.org/software/texinfo/index.html). * Menu: * Introduction:: * Installation:: * The REPL:: * Between the parens:: * Cheat sheet:: * No hacker is an island:: * Index:: -- The Detailed Node Listing -- Introduction * Modus operandi:: * Showing off:: Installation * Must needs:: * The easy and quick way:: * From the source's mouth:: * Friends:: The REPL * Starting the REPL:: * First aids:: * Switching context:: * Completion and error handling:: * Autodoc and friends:: * Seeing is believing:: * Customization and tips:: Between the parens * Activating Geiser:: * The source and the REPL:: * Documentation helpers:: * To eval or not to eval:: * To err perchance to debug:: * Jumping around:: * Geiser writes for you:: Cheat sheet * Scheme buffers:: * REPL:: * Documentation browser:: Geiser is a collection of Emacs major and minor modes that conspire with one or more Scheme interpreters to keep the Lisp Machine Spirit alive. It draws inspiration (and a bit more) from environments such as Common Lisp's Slime, Factor's FUEL, Squeak or Emacs itself, and does its best to make Scheme hacking inside Emacs (even more) fun. Or, to be precise, what i (http://hacks-galore.org/jao) consider fun. Geiser is thus my humble contribution to the dynamic school of expression, and a reaction against what i perceive as a derailment, in modern times, of standard Scheme towards the static camp. Because i prefer growing and healing to poking at corpses, the continuously running Scheme interpreter takes the center of the stage in Geiser. A bundle of Elisp shims orchestrates the dialog between the Scheme interpreter, Emacs and, ultimately, the schemer, giving her access to live metadata. Here's how.  File: geiser.info, Node: Introduction, Next: Installation, Prev: Top, Up: Top 1 Introduction ************** Geiser is an Emacs environment to hack and have fun in Scheme. If that's enough for you, see *note Installation:: to get it running and *note The REPL:: for the fun part. * Menu: * Modus operandi:: * Showing off::  File: geiser.info, Node: Modus operandi, Next: Showing off, Prev: Introduction, Up: Introduction 1.1 Modus operandi ================== As already mentioned, Geiser relies on a running Scheme process to obtain the information it makes accessible to the programmer. There's little effort, on the Elisp side, to understand, say, the module system used by the Scheme implementation at hand; instead, a generic interface between the two worlds is defined, and each supported Scheme includes a library implementing that API, together with some wee shims in Elisp allowing the reuse of the Emacs-side framework, which constitutes the bulk of the code. While being as generic as possible, the Scheme-Elisp interface makes some assumptions about the capabilities and interaction mode of the corresponding REPL. In particular, Geiser expects the latter to support namespaces in the form of a module system, and to provide a well-defined way to establish the REPL's current namespace (or module), as well as the current file's module (or namespace). Thus, all evaluations performed by Geiser either in the REPL or in a source code buffer happen in the context of the current namespace. Every time you switch to a different file, you're switching namespaces automatically; at the REPL, you must request the switch explicitly (usually just using means provided by the Scheme implementation itself). If your favourite Scheme supports the above modus operandi, it has all that's needed for a bare-bones Geiser mode. But Geiser can, and will, use any metadata available: procedure arities and argument lists to display interactive help, documentation strings, location information to jump to definitions, export lists to provide completion, and so on and so forth. Although this is not an all-or-none proposition (Geiser can operate with just part of that functionality available), i initially concentrated in supporting those Schemes with the richest (to my knowledge) introspection capabilities, namely, Guile and Racket. Later on, Dan Leslie added support for Chicken, and there's active work to add support for scsh.  File: geiser.info, Node: Showing off, Prev: Modus operandi, Up: Introduction 1.2 Showing off =============== When working with a fully conniving Scheme, Geiser can offer the following functionality: * Form evaluation in the context of the current file's module. * Macro expansion. * File/module loading and/or compilation. * Namespace-aware identifier completion (including local bindings, names visible in the current module, and module names). * Autodoc: the echo area shows information about the signature of the procedure/macro around point automatically. * Jump to definition of identifier at point. * Access to documentation (including docstrings when the implementation provides it). * Listings of identifiers exported by a given module. * Listings of callers/callees of procedures. * Rudimentary support for debugging (when the REPL provides a debugger) and error navigation. * Support for multiple, simultaneous REPLs. * Support for image display in those Schemes that treat them as first class values. In the following pages, i'll try to explain what these features actually are (i'm just swanking here), and how to use them for your profit. But, before that, let's see how to install Geiser.  File: geiser.info, Node: Installation, Next: The REPL, Prev: Introduction, Up: Top 2 Installation ************** * Menu: * Must needs:: * The easy and quick way:: * From the source's mouth:: * Friends::  File: geiser.info, Node: Must needs, Next: The easy and quick way, Prev: Installation, Up: Installation 2.1 Must needs ============== If Geiser came with any guarantees, you'd break all of them by not using GNU Emacs 23.2 (or better: i regularly use it with a recent Emacs snapshot) and at least one of the supported Schemes, namely: * Racket (http://www.racket-lang.org) 6.0 or better * Guile (http://www.gnu.org/software/guile) 2.0.9 or better * Chicken (http://call-cc.org) 4.8.0 or better Since Geiser supports multiple REPLs, having both of them will just add to the fun. You'll also need Geiser itself. The quickest installation is via its ELPA package, as described in the next section. If you prefer to use the source code directly, it's not that difficult either: just keep on reading.  File: geiser.info, Node: The easy and quick way, Next: From the source's mouth, Prev: Must needs, Up: Installation 2.2 The easy and quick way ========================== Did i mention that the easiest way of installing Geiser is using its ELPA (http://emacswiki.org/emacs/ELPA) package? If you're using Emacs 24, ELPA (http://emacswiki.org/emacs/ELPA) is already there; for earlier versions, the page i just linked to twice will tell you where to find the goodies. ELPA packages live in repositories accessible via HTTP. You can find Geiser's package in either MELPA stable (http://melpa-stable.org/#/geiser) or, if you like living on the bleeding edge, MELPA (http://melpa.org/#/geiser) (directly from the git repo). To tell Emacs that an ELPA repo exists, you add it to 'package-archives': (require 'package) ;;; either the stable version: (add-to-list 'package-archives ;; choose either the stable or the latest git version: ;; '("melpa-stable" . "http://melpa-stable.org/packages/") '("melpa-unstable" . "http://melpa.org/packages/")) (package-initialize) And then installing Geiser is as easy as: M-x package-install RET geiser RET Alternatively, you can manually download the package file (http://download-mirror.savannah.gnu.org/releases/geiser/packages/geiser-0.8.1.tar), and install from your local disk with 'M-x package-install-file'. If you plan to use Chicken, you'll need also to fire a terminal and configure a couple of Chicken eggs: $ chicken-install -s apropos chicken-doc $ cd `csi -p '(chicken-home)'` $ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx With that, you are pretty much all set up. See *note The REPL:: to start using Geiser.  File: geiser.info, Node: From the source's mouth, Next: Friends, Prev: The easy and quick way, Up: Installation 2.3 Installing from source ========================== Downloading Geiser .................. The latest release tarball can be found here (http://download-mirror.savannah.gnu.org/releases/geiser/0.8.1/). Just download geiser-0.8.1.tar.gz (http://download-mirror.savannah.gnu.org/releases/geiser/0.8.1/geiser-0.8.1.tar.gz) and untar it in a directory of your choice. If you feel like living on the bleeding edge, just grab Geiser from its Git repository over at Savannah (http://git.savannah.nongnu.org/cgit/geiser.git/), either with the following incantation: git clone git://git.sv.gnu.org/geiser.git or, if you happen to live behind a firewall, with the alternative: git clone http://git.sv.gnu.org/r/geiser.git You can also follow Geiser's development in one (https://github.com/jaor/geiser) or (http://repo.or.cz/w/geiser.git) three (http://gitorious.org/geiser) mirrors that are kept synchronized with the one at Savannah. Either way, you'll now be in possession of a copy of Geiser's libre code. I'll follow you into its directory and the next section. Setting it up ............. Geiser is ready to be used out of the box without much more ado. For the sake of concreteness, let's assume you put its source in the directory '~/lisp/geiser'. All you need to do is to add the following line to your Emacs initialisation file (be it '~/.emacs' or any of its moral equivalents): (load-file "~/lisp/geiser/elisp/geiser.el") or simply evaluate that form inside Emacs (you wouldn't kill a friend just to start using Geiser, would you?). That's it: you're ready to go (*note The REPL::). What? You still here? I promise the above is all that's needed to start using Geiser. But, in case you are missing your configure/make all install routine, by all means, you can go through those motions to byte compile and install Geiser too. That is, you enter the source directory and (since we grabbed the development tree) run the customary autogen script: $ cd ~/lisp/geiser $ ./autogen.sh I recommend that you compile Geiser in a separate directory: $ mkdir build && cd build $ ../configure $ make all Now you have two options: loading the byte-compiled Geiser from the 'elisp' subdirectory, or installing it system-wide. To load the byte-code from here, add this line to your initialisation file: (load "~/lisp/geiser/build/elisp/geiser-load") and eval that form and you're done (you could also restart Emacs, but killing your friends is widely considered bad form). Yes, that's 'load' and 'geiser-load' instead of 'load-file' and 'geiser.el'. If you prefer a system-wide installation, just type: $ sudo make install With the above spell, Geiser will be compiled and installed in a safe place inside Emacs load path. To load it into Emacs you'll need, instead of the 'load-file' form above, the following line in your initialisation file: (require 'geiser-install) Please note that we're requiring 'geiser-install', and not 'geiser', and that there's no 'load-file' to be seen this time. There are some ways of fine-tuning this process, mainly by providing additional arguments in the call to configure: you'll find those gory details in the file called 'INSTALL', right at the root of the source tree. The installation will also take care of placing this manual, in Info format, where Emacs can find it, so you can continue to learn about Geiser inside its natural habitat. See you there and into the next chapter!  File: geiser.info, Node: Friends, Prev: From the source's mouth, Up: Installation 2.4 Friends =========== Although Geiser does not need them, it plays well with (and is enhanced by) the following Emacs packages: * Paredit (http://www.emacswiki.org/emacs/ParEdit). Regardless of whether you use Geiser or not, you shouldn't be coding in any Lisp dialect without the aid of Taylor Campbell's structured editing mode. * Company (http://company-mode.github.io/). Nikolaj Schumacher's and Dmitry Gutov's 'company-mode' provides a generic front-end for completion engines (such as Geiser's), with pretty and automatic completion lists. * ac-geiser (https://github.com/xiaohanyu/ac-geiser/) If you prefer 'auto-complete-mode' to 'company-mode', Xiao Hanyu's 'ac-geiser', which provides a Geiser plugin for the popular Emacs Auto Completion Mode (http://cx4a.org/software/auto-complete/), is the package for you. Like Geiser, 'ac-geiser' is available in Marmalade and MELPA, and also as an 'el-get' package. * Quack (http://www.neilvandyke.org/quack/). You can still use the many goodies provided by Neil van Dyke's 'quack-mode', since most of them are not (yet) available in Geiser. The only caveat might be a conflict between Quack's and Geiser's default key bindings, which i'm sure you'll manage to tackle just fine. It's also probably a good idea to require 'quack' after loading 'geiser.el' (or requiring a compiled version). You just need to install and setup them as usual, for every package's definition of usual. Geiser will notice their presence and react accordingly.  File: geiser.info, Node: The REPL, Next: Between the parens, Prev: Installation, Up: Top 3 The REPL ********** If you've followed the instructions in *note Installation::, your Emacs is now ready to start playing. Otherwise, i'll wait for you: when you're ready, just come back here and proceed to the following sections. * Menu: * Starting the REPL:: * First aids:: * Switching context:: * Completion and error handling:: * Autodoc and friends:: * Seeing is believing:: * Customization and tips::  File: geiser.info, Node: Starting the REPL, Next: First aids, Prev: The REPL, Up: The REPL 3.1 Starting the REPL ===================== To start a Scheme REPL (meaning, a Scheme process offering you a Read-Eval-Print Loop), Geiser provides the generic interactive command 'run-geiser'. If you invoke it (via, as is customary in Emacs, 'M-x run-geiser'), you'll be saluted by a prompt asking which one of the supported implementations you want to launch--yes, you can stop the asking, see *note below: active-implementations. Tabbing for completion will offer you, as of this writing, 'guile' and 'racket'. Just choose your poison, and a new REPL buffer will pop up (by default, the REPL will appear in a new window: if that annoys you, just set 'geiser-repl-use-other-window' to 'nil' and the current window will be used). If all went according to plan, you'll be facing an implementation-dependent banner, followed by an interactive prompt. Going according to plan includes having the executable of the Scheme you chose in your path. If that's not the case, you can tell Emacs where it is, as described in *note a moment: impl-binary. Returning to our REPL, the first thing to notice is that the funny prompt is telling you your current module: its name is the part just after the @ sign (in Guile, that means 'guile-user', while Racket's and Chicken's top namespaces don't have a name; cf. discussion in *note Switching context::). than that, this is pretty much equivalent to having a command-line interpreter in a terminal, with a bunch of add-ons that we'll be reviewing below. You can start typing sexps right there: Geiser will only dispatch them for evaluation when they're complete, and will indent new lines properly until then. It will also keep track of your input, maintaining a history file that will be reloaded whenever you restart the REPL. If you're not happy with the faces Geiser is using for the REPL's prompt and evaluated input, you can customise 'geiser-font-lock-repl-prompt' and 'geiser-font-lock-repl-input' to better looking faces. Connecting to an external Scheme ................................ There's an alternative way of starting a Geiser REPL: you can connect to an external Scheme process, provided it's running a REPL server at some known port. How to make that happen depends on the Scheme implementation. If you use Guile, you just need to start your Guile process (possibly outside Emacs) passing to it the flag '--listen'. This flag accepts an optional port as argument (as in '--listen=1969'), if you don't want to use the default. In Racket, you have to use the REPL server that comes with Geiser. To that end, put Geiser's Racket 'scheme' directory in Racket's collection search path and invoke 'start-geiser' (a procedure in the module 'geiser/server') somewhere in your program, passing it the desired port and, if desired, network interface name. This procedure will start the REPL server in a separate thread. For an example of how to do that, see the script 'bin/geiser-racket.sh' in the source distribution, or, if you've compiled Geiser, 'bin/geiser-racket-noinst' in the build directory, or, if you've installed Geiser, 'geiser-racket' in '/bin'. These scripts start a new interactive Racket that is also running a REPL server (they also load the errortrace library to provide better diagnostics, but that's not strictly needed). With your external Scheme process running and serving, come back to Emacs and execute 'M-x geiser-connect', 'M-x connect-to-guile' or 'M-x connect-to-racket'. You'll be asked for a host and a port, and, voila, you'll have a Geiser REPL that is served by the remote Scheme process in a dedicated thread, meaning that your external program can go on doing whatever it was doing while you tinker with it from Emacs. Note, however, that all Scheme threads share the heap, so that you'll be able to interact with those other threads in the running Scheme from Emacs in a variety of ways. For starters, all your (re)definitions will be visible everywhere. That's dangerous, but will come in handy when you need to debug your running web server. The connection between Emacs and the Scheme process goes over TCP, so it can be as remote as you need, perhaps with the intervention of an SSH tunnel.  File: geiser.info, Node: First aids, Next: Switching context, Prev: Starting the REPL, Up: The REPL 3.2 First aids ============== A quick way of seeing what else Geiser's REPL can do for you, is to display the corresponding entry up there in your menu bar. No, i don't normally use menus either; but they can come in handy until you've memorized Geiser's commands, as a learning device. And yes, i usually run Emacs inside a terminal, but one can always use La Carte (http://www.emacswiki.org/emacs/LaCarte) to access the menus in a convenient enough fashion. Or just press 'C-h m' and be done with that. Among the commands at your disposal, we find the familiar input navigation keys, with a couple twists. By default, 'M-p' and 'M-n' are bound to matching items in your input history. That is, they'll find the previous or next sexp that starts with the current input prefix (defined as the text between the end of the prompt and your current position, a.k.a. "point", in the buffer). For going up and down the list unconditionally, just use 'C-c M-p' and 'C-c M-n'. In addition, navigation is sexp-based rather than line-based. There are also a few commands to twiddle with the Scheme process. 'C-c C-q' will gently ask it to quit, while 'C-u C-c C-q' will mercilessly kill the process (but not before stowing your history in the file system). Unless you're using a remote REPL, that is, in which case both commands will just sever the connection and leave the remote process alone. If worse comes to worst and the process is dead, 'C-c C-z' will restart it. However, the same shortcut, issued when the REPL is alive, will bring you back to the buffer you came from, as explained in *note this section: switching-repl-buff. The remaining commands are meatier, and deserve sections of their own.  File: geiser.info, Node: Switching context, Next: Completion and error handling, Prev: First aids, Up: The REPL 3.3 Switching context ===================== In tune with Geiser's modus operandi, evaluations in the REPL take place in the namespace of the current module. As noted above, the REPL's prompt tells you the name of the current module. To switch to a different one, you can use the command 'switch-to-geiser-module', bound to 'C-c C-m'. You'll notice that Geiser simply uses a couple of meta-commands provided by the Scheme REPL (the stock ',m' in Guile and Chicken and the (geiser-defined) ',enter' in Racket), and that it doesn't even try to hide that fact. That means that you can freely use said native ways directly at the REPL, and Geiser will be happy to oblige. In Racket, ',enter' works like Racket's standard 'enter!' form, but you can also provide a path string as its argument (e.g., ',enter "/tmp/foo.rkt"' is equivalent to ',enter (file "/tmp/foo.rkt")'). Like 'enter!', ',enter' accepts also module names (as in, say, ',enter geiser/main'). As mentioned, in Guile and Chicken, ',m' is used as is. Once you enter a new module, only those bindings visible in its namespace will be available to your evaluations. All Schemes supported by Geiser provide a way to import new modules in the current namespace. Again, there's a Geiser command, 'geiser-repl-import-module', to invoke such functionality, bound this time to 'C-c C-i'. And, again, you'll see Geiser just introducing the native incantation for you, and you're free to use such incantations by hand whenever you want. One convenience provided by these two Geiser commands is that completion is available when introducing the new module name, using the '' key. Pressing it at the command's prompt will offer you a prefix-aware list of available module names. Which brings me to the next group of REPL commands.  File: geiser.info, Node: Completion and error handling, Next: Autodoc and friends, Prev: Switching context, Up: The REPL 3.4 Completion and error handling ================================= We've already seen Geiser completion of module names in action at the minibuffer. You won't be surprised to know that it's also available at the REPL buffer itself. There, you can use either 'C-.' or 'M-`' to complete module names, and '' or 'M-' to complete identifiers. Geiser will know what identifiers are bound in the current module and show you a list of those starting with the prefix at point. Needless to say, this is not a static list, and it will grow as you define or import new bindings in the namespace at hand. If no completion is found, '' will try to complete the prefix after point as a module name. REPL buffers use Emacs' compilation mode to highlight errors reported by the Scheme interpreter, and you can use the 'next-error' command ('M-g n') to jump to their location. By default, every time you enter a new expression for evaluation old error messages are forgotten, so that 'M-g n' will always jump to errors related to the last evaluation request, if any. If you prefer a not-so-forgetful REPL, set the customization variable 'geiser-repl-forget-old-errors-p' to 'nil'. Note, however, that even when that variable is left as 't', you can always jump to an old error by moving to its line at the REPL and pressing ''. When your cursor is away from the last prompt, '' will move to the next error in the buffer, and you can use '' everywhere to go to the previous one.  File: geiser.info, Node: Autodoc and friends, Next: Seeing is believing, Prev: Completion and error handling, Up: The REPL 3.5 Autodoc and friends ======================= Oftentimes, there's more you'll want to know about an identifier besides its name: What module does it belong to? Is it a procedure and, if so, what arguments does it take? Geiser tries to help you answering those questions too. Actually, if you've been playing with the REPL as you read, you might have notice some frantic activity taking place in the echo area every now and then. That was Geiser trying to be helpful (while, hopefully, not being clippy), or, more concretely, what i call, for want of a better name, its "autodoc" mode. Whenever it's active (did you notice that A in the mode-line?), Geiser's gerbils will be scanning what you type and showing (unless you silence them with 'C-c C-d C-a') information about the identifier nearest to point. If that identifier corresponds to a variable visible in the current namespace, you'll see the module it belongs to and its value. For procedures and macros, autodoc will display, instead of their value, the argument names (or an underscore if Geiser cannot determine the name used in the definition). Optional arguments are surrounded by parentheses. When the optional argument has a default value, it's represented by a list made up of its name and that value. When the argument is a keyword argument, its name has "#:" as a prefix. If that's not enough documentation for you, 'C-c C-d d' will open a separate documentation buffer with help on the symbol at point. This buffer will contain implementation-specific information about the identifier (e.g., its docstring for Guile, or its contract, if any, for Racket), and a handy button to open the corresponding manual entry for the symbol, which will open an HTML page (for Racket and Chicken) or the texinfo manual (for Guile). If you'd rather go directly to the manual, try 'C-c C-d i', which invokes 'geiser-doc-look-up-manual' as the handy button does. Geiser can also produce for you a list, classified by kind, of the identifiers exported by a given module: all you need to do is press 'C-c C-d m', and type or complete the desired module's name. The list of exported bindings is shown, again, in a buffer belonging to Geiser's documentation browser, where you have at your disposal a bunch of navigation commands listed in *note our cheat-sheet: Documentation browser. We'll have a bit more to say about the documentation browser in *note a later section: doc-browser. If that's still not enough, Geiser can jump, via 'M-.', to the symbol's definition. A buffer with the corresponding file will pop up, with its point resting upon the identifier's defining form. When you're done inspecting, 'M-,' will bring you back to where you were. As we will see, these commands are also available in Scheme buffers. 'M-.' also works for modules: if your point is on an unambiguous module name, the file where it's defined will be opened for you.  File: geiser.info, Node: Seeing is believing, Next: Customization and tips, Prev: Autodoc and friends, Up: The REPL 3.6 Seeing is believing ======================= In schemes that support images as values (currently, that means Racket), the REPL will display them inline if you're using them in a graphics-aware Emacs. For the terminal, images will appear as buttons: press return on them to invoke an external viewer (configurable via 'geiser-image-viewer') that will show you the image at hand. You can also ask for the same behaviour on all emacsen by customising 'geiser-repl-inline-images-p' to 'nil'. Geiser keeps a cache of the last displayed images in the directory 'geiser-image-cache-dir', which defaults to the system's temp directory, with up to 'geiser-image-cache-keep-last' files. You can invoke the external image viewer on any of them with 'M-x geiser-view-last-image', which takes a prefix argument to indicate which image number you want, 0 corresponding to the newest one.  File: geiser.info, Node: Customization and tips, Prev: Seeing is believing, Up: The REPL 3.7 Customization and tips ========================== The looks and ways of the REPL can be fine-tuned via a bunch of customization variables. You can see and modify them all in the corresponding customization group (by using the menu entry or the good old 'M-x customize-group geiser-repl'), or by setting them in your Emacs initialisation files (as a rule, all knobs in Geiser are tunable this way: you don't need to use customization buffers if you don't like them). I'm documenting below a proper subset of those settings, together with some related tips. Choosing a Scheme implementation ................................ Instead of using the generic 'run-geiser' command, you can start directly your Scheme of choice via 'run-racket' or 'run-guile'. In addition, the variable 'geiser-active-implementations' contains a list of those Schemes Geiser should be aware of. Thus, if you happen to be, say, a racketeer not to be beguiled by other schemes, you can tell Geiser to forget about the richness of the Scheme ecosystem with something like: (setq geiser-active-implementations '(racket)) in your initialisation files. When starting a new REPL, Geiser assumes, by default, that the corresponding Scheme binary is in your path. If that's not the case, the variables to tweak are 'geiser-guile-binary' and 'geiser-racket-binary', which should be set to a string with the full path to the requisite binary. Before starting the REPL, Geiser will check wether the version of your Scheme interpreter is good enough. This means that it will spend a couple tenths of a second launching and quickly discarding a Scheme process, but also that the error message you'll get if you're on the wrong Scheme version will be much more informative. If you one to avoid version checks, just check 'geiser-repl-skip-version-check-p' to 't' in your configuration. You can also specify a couple more initialisation parameters. For Guile, 'geiser-guile-load-path' is a list of paths to add to its load path (and its compiled load path) when it's started, while 'geiser-guile-init-file' is the path to an initialisation file to be loaded on start-up. The equivalent variables for Racket are 'geiser-racket-collects' and 'geiser-racket-init-file'. Note, however, that specifying 'geiser-guile-init-file' is not equivalent to changing Guile's initialization file ('~/.guile'), because the former is loaded using the '-l' flag, together with '-q' to disable loading the second. But there are subtle differences in the way Guile loads the initialization file versus how it loads a file specified via the '-l' flag. If what you want is just loading '~/.guile', leave 'geiser-guile-init-file' alone and set 'geiser-guile-load-init-file-p' to 't' instead. Racket startup time ................... When starting Racket in little computers, Geiser might have to wait a bit more than it expects (which is ten seconds, or ten thousand milliseconds, by default). If you find that Geiser is giving up too quickly and complaining that no prompt was found, try to increase the value of 'geiser-repl-startup-time' to, say, twenty seconds: (setq geiser-repl-startup-time 20000) If you prefer, you can use the customize interface to, well, customise the above variable's value. History ....... By default, Geiser won't record duplicates in your input history. If you prefer it did, just set 'geiser-repl-history-no-dups-p' to 'nil'. History entries are persistent across REPL sessions: they're saved in implementation-specific files whose location is controlled by the variable 'geiser-repl-history-filename'. For example, my Geiser configuration includes the following line: (setq geiser-repl-history-filename "~/.emacs.d/geiser-history") which makes the files 'geiser-history.guile' and 'geiser-history.racket' to live inside my home's '.emacs.d' directory. Autodoc ....... If you happen to love peace and quiet and prefer to keep your REPL's echo area free from autodoc's noise, 'geiser-repl-autodoc-p' is the customization variable for you: set it to 'nil' and autodoc will be disabled by default in new REPLs. You can always bring the fairies back, on a per-REPL basis, using 'C-c C-d C-a'. Remote connections .................. When using 'connect-to-guile', 'connect-to-racket' or 'geiser-connect', you'll be prompted for a host and a port, defaulting to "localhost" and 37146. You can change those defaults customizing 'geiser-repl-default-host' and 'geiser-repl-default-port', respectively. Killing REPLs ............. If you don't want Emacs to ask for confirmation when you're about to kill a live REPL buffer (as will happen, for instance, if you're exiting Emacs before closing all your REPLs), you can set the flag 'geiser-repl-query-on-kill-p' to 'nil'. On a related note, the customizable variable 'geiser-repl-query-on-exit-p' controls whether Geiser should ask for confirmation when you exit the REPL explicitly (via, say, 'C-c C-q', as opposed to killing the buffer), and is set to 'nil' by default.  File: geiser.info, Node: Between the parens, Next: Cheat sheet, Prev: The REPL, Up: Top 4 Between the parens ******************** A good REPL is a must, but just about half the story of a good Scheme hacking environment. Well, perhaps a bit more than a half; but, at any rate, one surely needs also a pleasant way of editing source code. Don't pay attention to naysayers: Emacs comes with an excellent editor included for about any language on Earth, and just the best one when that language is sexpy (especially if you use Paredit). Geiser's support for writing Scheme code adds to Emacs' 'scheme-mode', rather than supplanting it; and it does so by means of a minor mode (unimaginatively dubbed 'geiser-mode') that defines a bunch of new commands to try and, with the help of the same Scheme process giving you the REPL, make those Scheme buffers come to life. * Menu: * Activating Geiser:: * The source and the REPL:: * Documentation helpers:: * To eval or not to eval:: * To err perchance to debug:: * Jumping around:: * Geiser writes for you::  File: geiser.info, Node: Activating Geiser, Next: The source and the REPL, Prev: Between the parens, Up: Between the parens 4.1 Activating Geiser ===================== With Geiser installed following any of the procedures described in *note The easy and quick way:: or *note From the source's mouth::, Emacs will automatically activate geiser-mode when opening a Scheme buffer. Geiser also instructs Emacs to consider files with the extension 'rkt' part of the family, so that, in principle, there's nothing you need to do to ensure that Geiser's extensions will be available, out of the box, when you start editing Scheme code. Indications that everything is working according to plan include the 'Geiser' minor mode indicator in your mode-line and the appearance of a new entry for Geiser in the menu bar. If, moreover, the mode-line indicator is the name of a Scheme implementation, you're indeed in a perfect world; otherwise, don't despair and keep on reading: i'll tell you how to fix that in a moment. The menu provides a good synopsis of everything Geiser brings to the party, including those keyboard shortcuts we Emacsers love. If you're seeing the name of your favourite Scheme implementation in the mode-line, have a running REPL and are comfortable with Emacs, you can stop reading now and, instead, discover Geiser's joys by yourself. I've tried to make Geiser as self-documenting as any self-respecting Emacs package should be. If you follow this route, make sure to take a look at Geiser's customization buffers ('M-x customize-group geiser'): there's lot of fine-tuning available there. You might also want to take a glance at the tables in *note our cheat sheet: Cheat sheet. Since geiser-mode is a minor mode, you can toggle it with 'M-x geiser-mode', and control its activation in hooks with the functions 'turn-on-geiser-mode' and 'turn-off-geiser-mode'. If, for some reason i cannot fathom, you prefer geiser-mode not to be active by default, customizing 'geiser-mode-auto-p' to 'nil' will do the trick. And if you happen to use a funky extension for your Scheme files that is not recognised as such by Emacs, just tell her about it with: (add-to-list 'auto-mode-alist '("\\.funky-extension\\'" . scheme-mode)) Now, geiser-mode is just a useless wretch unless there's a running Scheme process backing it up. Meaning that virtually all the commands it provides require a REPL up and running, preferably corresponding to the correct Scheme implementation. In the following section, we'll see how to make sure that that's actually the case.  File: geiser.info, Node: The source and the REPL, Next: Documentation helpers, Prev: Activating Geiser, Up: Between the parens 4.2 The source and the REPL =========================== As i've already mentioned a couple of times, geiser-mode needs a running REPL to be operative. Thus, a common usage pattern will be for you to first call 'run-geiser' (or one of its variants, e.g. 'run-guile'), and then open some Scheme files; but there's nothing wrong in first opening a couple Scheme buffers and then starting the REPL (you can even find it more convenient, since pressing 'C-c C-z' in a Scheme buffer will start the REPL for you). Since Geiser supports more than one Scheme implementation, though, there's the problem of knowing which of them is to be associated with each Scheme source file. Serviceable as it is, geiser-mode will try to guess the correct implementation for you, according to the algorithm described below. How Geiser associates a REPL to your Scheme buffer .................................................. To determine what Scheme implementation corresponds to a given source file, Geiser uses the following algorithm: 1. If the file-local variable 'geiser-scheme-implementation' is defined, its value is used. A common way of setting buffer-local variables is to put them in a comment near the beginning of the file, surrounded by '-*-' marks, as in: ;; -*- geiser-scheme-implementation: guile -*- 2. If you've customized 'geiser-active-implementations' so that it's a single-element list, that element is used as the chosen implementation. 3. The contents of the file is scanned for hints on its associated implementation. For instance, files that contain a '#lang' directive will be considered Racket source code, while those with a 'define-module' form in them will be assigned to a Guile REPL. 4. The current buffer's file name is checked against the rules given in 'geiser-implementations-alist', and the first match is applied. You can provide your own rules by customizing this variable, as explained below. 5. If we haven't been lucky this far and you have customized 'geiser-default-implementation' to the name of a supported implementation, we'll follow your lead. 6. See? That's the problem of being a smart aleck: one's always outsmarted by people around. At this point, geiser-mode will humbly give up and ask you to explicitly choose the Scheme implementation. As you can see in the list above, there are several ways to influence Geiser's guessing by means of customizable variables. The most direct (and most impoverishing) is probably limiting the active implementations to a single one, while customizing 'geiser-implementations-alist' is the most flexible (and, unsurprisingly, also the most complex). Here's the default value for the latter variable: (((regexp "\\.scm$") guile) ((regexp "\\.ss$") racket) ((regexp "\\.rkt$") racket)) which describes the simple heuristic that files with '.scm' as extension are by default associated to a Guile REPL while those ending in '.ss' or '.rkt' correspond to Racket's implementation (with the caveat that these rules are applied only if the previous heuristics have failed to detect the correct implementation, and that they'll match only if the corresponding implementation is active). You can add rules to 'geiser-implementations-alist' (or replace all of them) by customizing it. Besides regular expressions, you can also use a directory name; for instance, the following snippet: (eval-after-load "geiser-impl" '(add-to-list 'geiser-implementations-alist '((dir "/home/jao/prj/frob") guile))) will add a new rule that says that any file inside my '/home/jao/prj/frob' directory (or, recursively, any of its children) is to be assigned to Guile. Since rules are first matched, first served, this new rule will take precedence over the default ones. A final tip: if you want Geiser to start automatically a REPL for you if it notices that there's no one active when it enters geiser-mode, you can customize 'geiser-mode-start-repl-p' to 't'. Switching between source files and the REPL ........................................... Once you have a working geiser-mode, you can switch from Scheme source buffers to the REPL or 'C-c C-z'. Those shortcuts map to the interactive command 'switch-to-geiser'. If you use a numeric prefix, as in 'C-u C-c C-z', besides being teleported to the REPL, the latter will switch to the namespace of the Scheme source file, as if you had used 'C-c C-m' in the REPL, with the source file's module as argument; cf. discussion in *note Switching context::. This command is also bound to 'C-c C-a'. Once you're in the REPL, the same 'C-c C-z' shortcut will bring you back to the buffer you jumped from, provided you don't kill the Scheme process in between. This is why the command is called switch-to-geiser instead of switch-to-repl, and what makes it really handy, if you ask me. If for some reason you're not happy with the Scheme implementation that Geiser has assigned to your file, you can change it with 'C-c C-s', and you probably should take a look at the previous subsection to make sure that Geiser doesn't get confused again. A note about context .................... As explained before (*note Modus operandi::), all Geiser activities take place in the context of the current namespace, which, for Scheme buffers, corresponds to the module that the Scheme implementation associates to the source file at hand (for instance, in Racket, there's a one-to-one correspondence between paths and modules, while Guile relies on explicit 'define-module' forms in the source file). Now that we have 'geiser-mode' happily alive in our Scheme buffers and communicating with the right REPL instance, let us see what it can do for us, besides jumping to and fro.  File: geiser.info, Node: Documentation helpers, Next: To eval or not to eval, Prev: The source and the REPL, Up: Between the parens 4.3 Documentation helpers ========================= Autodoc redux ............. The first thing you will notice by moving around Scheme source is that, every now and then, the echo area lights up with the same autodoc messages we know and love from our REPL forays. This happens every time the Scheme process is able to recognise an identifier in the buffer, and provide information either on its value (for variables) or on its arity and the name of its formal arguments (for procedures and macros). That information will only be available if the module the identifier belongs to has been loaded in the running Scheme image. So it can be the case that, at first, no autodoc is shown for identifiers defined in the file you're editing. But as soon as you evaluate them (either individually or collectively using any of the devices described in *note To eval or not to eval::) their signatures will start appearing in the echo area. Autodoc activation is controlled by a minor mode, 'geiser-autodoc', which you can toggle with 'M-x geiser-autodoc-mode', or its associated keyboard shortcut, 'C-c C-d a'. That /A indicator in the mode-line is telling you that autodoc is active. If you prefer that it be inactive by default (e.g., because you're connecting to a really remote scheme and want to minimize network exchanges), just set 'geiser-mode-autodoc-p' to 'nil' in your customization files. Even when autodoc mode is off, you can use 'geiser-autodoc-show', bound by default to 'C-c C-d s', to show the autodoc string for the symbol at point. The way autodoc displays information deserves some explanation. It will first show the name of the module where the identifier at hand is defined, followed by a colon and the identifier itself. If the latter corresponds to a procedure or macro, it will be followed by a list of argument names, starting with the ones that are required. Then there comes a list of optional arguments, if any, enclosed in parentheses. When an optional argument has a default value (or a form defining its default value), autodoc will display it after the argument name. When the optional arguments are keywords, their names are prefixed with "#:" (i.e., their names are keywords). An ellipsis (...) serves as a marker of an indeterminate number of parameters, as is the case with rest arguments or when autodoc cannot fathom the exact number of arguments (this is often the case with macros defined using 'syntax-case'). Another way in which autodoc displays its ignorance is by using an underscore to display parameters whose name is beyond its powers. It can also be the case that a function or macro has more than one signature (e.g., functions defined using 'case-lambda', or some 'syntax-rules' macros, for which Geiser has often the black magic necessary to retrieve their actual arities). In those cases, autodoc shows all known signatures (using the above rules for each one) separated by a vertical bar (|). As you have already noticed, the whole autodoc message is enclosed in parentheses. After all, we're talking about Scheme here. Finally, life is much easier when your cursor is on a symbol corresponding to a plain variable: you'll see in the echo area its name, preceded by the module where it's defined, and followed by its value, with an intervening arrow for greater effect. This time, there are no enclosing parentheses (i hope you see the logic in my madness). You can change the way Geiser displays the module/identifier combo by customizing 'geiser-autodoc-identifier-format'. For example, if you wanted a tilde surrounded by spaces instead of a colon as a separator, you would write something like: (setq geiser-autodoc-identifier-format "%s ~ %s") in your Emacs initialisation files. There's also a face ('geiser-font-lock-autodoc-identifier') that you can customize (for instance, with 'M-x customize-face') to change the appearance of the text. And another one ('geiser-font-lock-autodoc-current-arg') that controls how the current argument position is highlighted. Other documentation commands ............................ Sometimes, autodoc won't provide enough information for you to understand what a function does. In those cases, you can ask Geiser to ask the running Scheme for further information on a given identifier or module. For symbols, the incantation is 'M-x geiser-doc-symbol-at-point', or 'C-c C-d C-d' for short. If the associated Scheme supports docstrings (as, for instance, Guile does), you'll be teleported to a new Emacs buffer displaying Geiser's documentation browser, filled with information about the identifier, including its docstring (if any; unfortunately, that an implementation supports docstrings doesn't mean that they're used everywhere). Pressing 'q' in the documentation buffer will bring you back, enlightened, to where you were. There's also a handful of other navigation commands available in that buffer, which you can discover by means of its menu or via the good old 'C-h m' command. And feel free to use the navigation buttons and hyperlinks that justify my calling this buffer a documentation browser. For Racket, which does not support docstrings out of the box, this command will provide less information, but the documentation browser will display the corresponding contract when it's available, as well as some other tidbits for re-exported identifiers. You can also ask Geiser to display information about a module, in the form of a list of its exported identifiers, using 'C-c C-d C-m', exactly as you would do in *note the REPL: repl-mod. In both cases, the documentation browser will show a couple of buttons giving you access to further documentation. First, you'll see a button named source: pressing it you'll jump to the symbol's definition. The second button, dubbed manual, will open the Scheme implementation's manual page for the symbol at hand. For Racket, that will open your web browser displaying the corresponding reference's page (using the HTML browser in Racket's configuration, which you can edit in DrRacket's preferences dialog, or by setting 'plt:framework-pref:external-browser' directly in '~/.racket/racket-prefs.rktd'), while in Guile a lookup will be performed in the texinfo manual. For Guile, the manual lookup uses the info indexes in the standard Guile info nodes, which are usually named "guile" or "guile-2.0". If yours are named differently, just add your name to the customizable variable 'geiser-guile-manual-lookup-nodes'. A list of all navigation commands in the documentation browser is available in *note our cheat-sheet: Documentation browser. You can also skip the documentation browser and jump directly to the manual page for the symbol at point with the command 'geiser-doc-look-up-manual', bound to 'C-c C-d i'.  File: geiser.info, Node: To eval or not to eval, Next: To err perchance to debug, Prev: Documentation helpers, Up: Between the parens 4.4 To eval or not to eval ========================== One of Geiser's main goals is to facilitate incremental development. You might have noticed that i've made a big fuss of Geiser's ability to recognize context, by being aware of the namespace where its operations happen. That awareness is especially important when evaluating code in your scheme buffers, using the commands described below. They allow you to send code to the running Scheme with a granularity ranging from whole files to single s-expressions. That code will be evaluated in the module associated with the file you're editing, allowing you to redefine values and procedures to your heart's (and other modules') content. Macros are, of course, another kettle of fish: one needs to re-evaluate uses of a macro after redefining it. That's not a limitation imposed by Geiser, but a consequence of how macros work in Scheme (and other Lisps). There's also the risk that you lose track of what's actually defined and what's not during a given session. But, in my opinion (http://programming-musings.org/2009/03/29/from-my-cold-prying-hands/), those are limitations we lispers are aware of, and they don't force us to throw the baby with the bathwater and ditch incremental evaluation. Some people disagree; if you happen to find their arguments (http://blog.racket-lang.org/2009/03/drscheme-repl-isnt-lisp.html) convincing, you don't have to throw away Geiser together with the baby: 'M-x geiser-restart-repl' will let you restart the REPL as many times as you see fit. For all of you bearded old lispers still with me, here are some of the commands performing incremental evaluation in Geiser. 'geiser-eval-last-sexp', bound to 'C-x C-e', will eval the s-expression just before point. If you use a prefix, as in 'C-u C-x C-e', besides evaluating it the expression is inserted in the the buffer. 'geiser-eval-definition', bound to 'C-M-x', finds the topmost definition containing point and sends it for evaluation. The variant 'geiser-eval-definition-and-go' ('C-c M-e') works in the same way, but it also teleports you to REPL after the evaluation. 'geiser-eval-region', bound to 'C-c C-r', evals the current region. Again, there's an and-go version available, 'geiser-eval-region-and-go', bound to 'C-c M-r'. And, if you want to extend the evaluated region to the whole buffer, there is 'geiser-eval-buffer', bound to 'C-c C-b' and its companion 'geiser-eval-buffer-and-go', bound to 'C-c M-b'. For all the commands above, the result of the evaluation is displayed in the minibuffer, unless it causes a (Scheme-side) error (*note To err perchance to debug::), or, for schemes supporting them (such as Racket), the evaluation yields an image, in which case you'll see it in popping up in the Geiser debug buffer (if your Emacs runs under the auspices of a graphical toolkit), or via an external viewer if you set program (see also *note Seeing is believing:: for more on image support). At the risk of repeating myself, i'll remind you that all these evaluations will take place in the namespace of the module corresponding to the Scheme file from which you're sending your code, which, in general, will be different from the REPL's current module. And, if all goes according to plan, (re)defined variables and procedures should be immediately visible inside and, if exported, outside their module. Besides evaluating expressions, definitions and regions, you can also macro-expand them. The corresponding key bindings start with the prefix 'C-c C-m' and end, respectively, with 'C-e', 'C-x' and 'C-r'. The result of the macro expansion always appears in a pop up buffer.  File: geiser.info, Node: To err perchance to debug, Next: Jumping around, Prev: To eval or not to eval, Up: Between the parens 4.5 To err: perchance to debug ============================== When an error occurs during evaluation, it will be reported according to the capabilities of the underlying Scheme REPL. In Racket, you'll be presented with a backtrace, in a new buffer where file paths locating the origin of the error are click-able (you can navigate them using the key, and use or the mouse to jump to the offending spot; or invoke Emacs' stock commands 'next-error' and 'previous-error', bound to 'M-g n' and 'M-g p' by default). The Racket backtrace also highlights the exception type, making it click-able. Following the link will open the documentation corresponding to said exception type. Both the error and exception link faces are customizable ('geiser-font-lock-error-link' and 'geiser-font-lock-doc-link'). By default, Geiser will tele-transport your pointer to the debug buffer: if you prefer to stay in the source buffer, set 'geiser-debug-jump-to-debug-p' to nil. And if, in addition, you don't even want to see the error trace, customize 'geiser-debug-show-debug-p', again, to nil. On the other hand, Guile's reaction to evaluation errors is different: it enters the debugger in its REPL. Accordingly, the REPL buffer will pop up if your evaluation fails in a Guile file, and the error message and backtrace will be displayed in there, again click-able and all. But there you have the debugger at your disposal, with the REPL's current module set to that of the offender, and a host of special debugging commands that are described in Guile's fine documentation. In addition, Guile will sometimes report warnings for otherwise successful evaluations. In those cases, it won't enter the debugger, and Geiser will report the warnings in a debug buffer, as it does for Racket. You can control how picky Guile is reporting warnings by customizing the variable 'geiser-guile-warning-level', whose detailed docstring (which see, using, e.g. 'C-h v') allows me to offer no further explanation here. The customization group geiser-guile is also worth a glance, for a couple of options to fine-tune how Geiser interacts with Guile's debugger (and more). Same thing for racketeers and geiser-racket.  File: geiser.info, Node: Jumping around, Next: Geiser writes for you, Prev: To err perchance to debug, Up: Between the parens 4.6 Jumping around ================== This one feature is as sweet as it is easy to explain: 'M-.' ('geiser-edit-symbol-at-point') will open the file where the identifier around point is defined and land your point on its definition. To return to where you were, press 'M-,' ('geiser-pop-symbol-stack'). This command works also for module names: Geiser first tries to locate a definition for the identifier at point and, if that fails, a module with that name; if the latter succeeds, the file where the module is defined will pop up. Sometimes, the underlying Scheme will tell Geiser only the file where the symbol is defined, but Geiser will use some heuristics (read, regular expressions) to locate the exact line and bring you there. Thus, if you find Geiser systematically missing your definitions, send a message to the mailing list , and we'll try to make the algorithm smarter. You can control how the destination buffer pops up by setting 'geiser-edit-symbol-method' to either 'nil' (to open the file in the current window), ''window' (other window in the same frame) or ''frame' (in a new frame).  File: geiser.info, Node: Geiser writes for you, Prev: Jumping around, Up: Between the parens 4.7 Geiser writes for you ========================= No self-respecting programming mode would be complete without completion. In geiser-mode, identifier completion is bound to 'M-', and will offer all visible identifiers starting with the prefix before point. Visible here means all symbols imported or defined in the current namespace plus locally bound ones. E.g., if you're at the end of the following partial expression: (let ((default 42)) (frob def and press 'M-', one of the possible completions will be 'default'. After obtaining the list of completions from the running Scheme, Geiser uses the standard Emacs completion machinery to display them. That means, among other things, that partial completion is available: just try to complete 'd-s' or 'w-o-t-s' to see why this is a good thing. Partial completion won't work if you have disabled it globally in your Emacs configuration: if you don't know what i'm talking about, never mind: Geiser's partial completion will work for you out of the box. If you find the 'M' modifier annoying, you always have the option to activate 'geiser-smart-tab-mode', which will make the key double duty as the regular Emacs indentation command (when the cursor is not near a symbol) and Geiser's completion function. If you want this smarty pants mode always on in Scheme buffers, customize 'geiser-mode-smart-tab-p' to 't'. Geiser also knows how to complete module names: if no completion for the prefix at point is found among the currently visible bindings, it will try to find a module name that matches it. You can also request explicitly completion only over module names using 'M-`' (that's a backtick). Besides completion, there's also this little command, 'geiser-squarify', which will toggle the delimiters of the innermost list around point between round and square brackets. It is bound to 'C-c C-e ['. With a numeric prefix (as in, say, 'M-2 C-c C-e ['), it will perform that many toggles, forward for positive values and backward for negative ones.  File: geiser.info, Node: Cheat sheet, Next: No hacker is an island, Prev: Between the parens, Up: Top 5 Cheat sheet ************* In the tables below, triple chords always accept a variant with the third key not modified by ; e.g., 'geiser-autodoc-show' is bound both to 'C-c C-d C-s' and 'C-c C-d s'. * Menu: * Scheme buffers:: * REPL:: * Documentation browser::  File: geiser.info, Node: Scheme buffers, Next: REPL, Prev: Cheat sheet, Up: Cheat sheet 5.1 Scheme buffers ================== Key Command Description --------------------------------------------------------------------------- C-c C-z 'geiser-mode-switch-to-repl' Switch to REPL C-c C-a 'geiser-mode-switch-to-repl-and-enter'Switch to REPL and current module (also 'C-u C-c C-z') C-c C-s 'geiser-set-scheme' Specify Scheme implementation for buffer M-. 'geiser-edit-symbol-at-point' Go to definition of identifier at point M-, 'geiser-pop-symbol-stack' Go back to where M-. was last invoked C-c C-e C-m 'geiser-edit-module' Ask for a module and open its file C-c C-e C-l 'geiser-add-to-load-path' Ask for a directory and add to Scheme load path C-c C-e C-[ 'geiser-squarify' Toggle between () and [] for current form C-c C-\ 'geiser-insert-lambda' Insert greek lambda or, with prefix, a lambda form C-M-x 'geiser-eval-definition' Eval definition around point C-c M-e 'geiser-eval-definition-and-go'Eval definition around point and switch to REPL C-x C-e 'geiser-eval-last-sexp' Eval sexp before point C-c C-r 'geiser-eval-region' Eval region C-c M-r 'geiser-eval-region-and-go' Eval region and switch to REPL C-c C-b 'geiser-eval-buffer' Eval buffer C-c M-b 'geiser-eval-buffer-and-go' Eval buffer and switch to REPL C-c C-m C-x 'geiser-expand-definition' Macro-expand definition around point C-c C-m C-e 'geiser-expand-last-sexp' Macro-expand sexp before point C-c C-m C-r 'geiser-expand-region' Macro-expand region C-c C-k 'geiser-compile-current-buffer'Compile and load current file M-g n, C-x ' 'next-error' Jump to the location of next error M-g p 'previous-error' Jump to the location of previous error C-c C-d C-d 'geiser-doc-symbol-at-point' See documentation for identifier at point C-c C-d C-s 'geiser-autodoc-show' Show signature or value for identifier at point in echo area C-c C-d C-m 'geiser-doc-module' See a list of a module's exported identifiers C-c C-d C-i 'geiser-doc-look-up-manual' Look up manual for symbol at point C-c C-d C-a 'geiser-autodoc-mode' Toggle autodoc mode C-c < 'geiser-xref-callers' Show callers of procedure at point C-c > 'geiser-xref-callees' Show callees of procedure at point M-TAB 'completion-at-point' Complete identifier at point M-', C-. 'geiser-completion--complete-module'Complete module name at point  File: geiser.info, Node: REPL, Next: Documentation browser, Prev: Scheme buffers, Up: Cheat sheet 5.2 REPL ======== Key Command Description --------------------------------------------------------------------------- C-c C-z 'switch-to-geiser' Start Scheme REPL, or jump to previous buffer C-c M-o 'geiser-repl-clear-buffer' Clear REPL buffer C-c C-k 'geiser-repl-interrupt' Interrupt REPL evaluation (signalling inferior scheme) C-c C-q 'geiser-repl-exit' Kill Scheme process M-. 'geiser-edit-symbol-at-point' Edit identifier at point TAB 'geiser-repl-tab-dwim' Complete, indent, or go to next error S-TAB 'geiser-repl--previous-error' Go to previous error in the (backtab) REPL buffer M-TAB 'completion-at-point' Complete indentifier at point M-', C-. 'geiser-completion--complete-module'Complete module name at point C-c C-r 'geiser-add-to-load-path' Ask for a directory and add to Scheme load path M-p, M-n (comint commands) Prompt history, matching current prefix C-c M-p, C-c (comint commands) Previous/next prompt inputs M-n C-c C-m 'switch-to-geiser-module' Set current module C-c C-i 'geiser-repl-import-module' Import module into current namespace C-c C-d C-d 'geiser-doc-symbol-at-point' See documentation for symbol at point C-c C-d C-i 'geiser-doc-look-up-manual' Look up manual for symbol at point C-c C-d C-m 'geiser-repl--doc-module' See documentation for module C-c C-d C-a 'geiser-autodoc-mode' Toggle autodoc mode  File: geiser.info, Node: Documentation browser, Prev: REPL, Up: Cheat sheet 5.3 Documentation browser ========================= Key Command Description --------------------------------------------------------------------------- TAB, n 'forward-button' Next link S-TAB, p 'backward-button' Previous link N 'geiser-doc-next-section' Next section P 'geiser-doc-previous-section' Previous section f 'geiser-doc-next' Next page b 'geiser-doc-previous' Previous page k 'geiser-doc-kill-page' Kill current page and go to previous or next g, r 'geiser-doc-refresh' Refresh page c 'geiser-doc-clean-history' Clear browsing history ., M-. 'geiser-doc-edit-symbol-at-point'Edit identifier at point z 'geiser-doc-switch-to-repl' Switch to REPL q 'View-quit' Bury buffer  File: geiser.info, Node: No hacker is an island, Next: Index, Prev: Cheat sheet, Up: Top 6 No hacker is an island ************************ Dan Leslie, with the help of his three-months old daughter Freija, proved there's a smidgen of sense in this madness by adding support for Chicken to version 0.7 of Geiser, several years after it was born. Andy Wingo, Geiser's first user, has been a continuous source of encouragement and suggestions, and keeps improving Guile and heeding my feature requests. The nice thing about collaborating with Andreas Rottmann over all these years is that he will not only make your project better with insightful comments and prodding: he'll send you patches galore too. Ludovic Courtès, #geiser's citizen no. 1, joined the fun after a while, and has since then been a continuous source of encouragement, ideas and bug reports. Michael Wilber convinced me that image support for Racket was not only fun, but easy, with the best argument: actual code! Daniel Hackney and Grant Rettke created the first ELPA packages for Geiser and taught me to fish. Diogo F. S. Ramos is Geiser's most indefatigable user and bug reporter, and the mailing list has been a far less lonely place since he came. Aleix Conchillo has been my favourite spammer, beta tester and patch sender during more years and for more projects than i can remember. Eduardo Cavazos' contagious enthusiasm has helped in many ways to keep Geiser alive, and he's become its best evangelist in R6RS circles. Alex Kost has contributed with many bug reports and improved Geiser with several patches. Eli Barzilay took the time to play with an early alpha and made many valuable suggestions, besides answering all my 'how do you in PLT' questions. Matthew Flatt, Robby Findler and the rest of the PLT team did not only answer my inquiries, but provided almost instant fixes to the few issues i found. Thanks also to the PLT and Guile communities, for showing me that Geiser was not only possible, but a pleasure to hack on. And to the Slime hackers, who led the way. Joining the fun ............... * For questions, praise, critique and anything else Geiser, do not hesitate to drop an email to our list, (@ geiser-users (. nongnu org)) (mailto:geiser-users@nongnu.org): no subscription required. Check the list page (http://lists.nongnu.org/mailman/listinfo/geiser-users) for more information or browse the archives (http://lists.nongnu.org/archive/html/geiser-users/). The list is also accessible via Gmane (http://gmane.org) as gmane.lisp.scheme.geiser (http://dir.gmane.org/gmane.lisp.scheme.geiser). * You can submit bug reports either to the mailing list or to our bug tracker (https://github.com/jaor/geiser/issues) over at Github. * If you only need to hear about Geiser on new releases, the News page (http://savannah.nongnu.org/news/?group=geiser) and its Atom feed (https://savannah.nongnu.org/news/atom.php?group=geiser) are probably what you're looking for. * The Freenode IRC channel #geiser is the Geiserati's meeting point in cyberspace.  File: geiser.info, Node: Index, Prev: No hacker is an island, Up: Top Index ***** [index] * Menu: * ,enter vs. enter!: Switching context. (line 6) * ac-geiser: Friends. (line 9) * ask on kill, don't: Customization and tips. (line 111) * autocomplete: Friends. (line 9) * autodoc customized: Documentation helpers. (line 64) * autodoc explained: Documentation helpers. (line 32) * autodoc for variables: Documentation helpers. (line 58) * autodoc, disabling: Customization and tips. (line 94) * autodoc, in scheme buffers: Documentation helpers. (line 9) * autodoc, in the REPL: Autodoc and friends. (line 11) * autostart REPL: The source and the REPL. (line 80) * backtraces: To err perchance to debug. (line 6) * bug tracker: No hacker is an island. (line 66) * byte-compilation: From the source's mouth. (line 49) * Chicken: The easy and quick way. (line 37) * Chicken installation: The easy and quick way. (line 37) * company: Friends. (line 9) * completion for module names: Geiser writes for you. (line 33) * completion in scheme buffers: Geiser writes for you. (line 6) * completion, at the REPL: Completion and error handling. (line 6) * connect to server: Starting the REPL. (line 43) * corpses: Top. (line 79) * current module: Modus operandi. (line 15) * current module, change: Switching context. (line 21) * current module, in REPL: Switching context. (line 6) * derailment: Top. (line 79) * disabling autodoc: Documentation helpers. (line 22) * docstrings, maybe: Documentation helpers. (line 85) * documentation for symbol: Documentation helpers. (line 85) * ELPA: The easy and quick way. (line 6) * error buffer: To err perchance to debug. (line 9) * evaluating images: To eval or not to eval. (line 52) * evaluation: To eval or not to eval. (line 33) * external image viewer: Seeing is believing. (line 10) * faces, in the REPL: Starting the REPL. (line 35) * geiser-mode: Activating Geiser. (line 6) * geiser-mode commands: Activating Geiser. (line 21) * gmane: No hacker is an island. (line 56) * Guile info nodes: Documentation helpers. (line 120) * Guile's REPL server: Starting the REPL. (line 48) * GUILE_LOAD_COMPILED_PATH: Customization and tips. (line 46) * GUILE_LOAD_PATH: Customization and tips. (line 46) * help on identifier: Autodoc and friends. (line 29) * host, default: Customization and tips. (line 103) * image cache: Seeing is believing. (line 16) * image display: To eval or not to eval. (line 52) * image support: Seeing is believing. (line 6) * image viewer: Seeing is believing. (line 10) * incremental development: To eval or not to eval. (line 6) * incremental development, evil: To eval or not to eval. (line 18) * incremental development, not evil: To eval or not to eval. (line 33) * IRC channel: No hacker is an island. (line 72) * jump, at the REPL: Autodoc and friends. (line 51) * jumping customized: Jumping around. (line 22) * jumping in scheme buffers: Jumping around. (line 6) * mailing list: No hacker is an island. (line 56) * manual autodoc: Documentation helpers. (line 22) * module exports: Autodoc and friends. (line 39) * modus operandi: Modus operandi. (line 6) * news feed: No hacker is an island. (line 68) * opening manual pages: Documentation helpers. (line 128) * paredit: Friends. (line 9) * partial completion: Geiser writes for you. (line 18) * peace and quiet: Customization and tips. (line 94) * philosophy: Top. (line 79) * philosophy <1>: To eval or not to eval. (line 6) * PLTCOLLECTS: Customization and tips. (line 46) * port, default: Customization and tips. (line 103) * quack: Friends. (line 9) * quick install: The easy and quick way. (line 6) * Racket's REPL server: Starting the REPL. (line 53) * recursion: Index. (line 6) * remote connections: Starting the REPL. (line 78) * remote REPL: Starting the REPL. (line 43) * REPL: Starting the REPL. (line 6) * REPL commands: First aids. (line 6) * REPL customization: Customization and tips. (line 6) * REPL, faces: Starting the REPL. (line 35) * scheme binary: Customization and tips. (line 32) * scheme executable path: Customization and tips. (line 32) * scheme file extensions: Activating Geiser. (line 38) * scheme implementation, choosing: Customization and tips. (line 20) * scheme implementation, choosing <1>: The source and the REPL. (line 21) * scheme init file: Customization and tips. (line 46) * scheme load path: Customization and tips. (line 46) * smart tabs: Geiser writes for you. (line 26) * start REPL, automatically: The source and the REPL. (line 80) * startup timeout: Customization and tips. (line 65) * supported versions: Must needs. (line 6) * swanking: Showing off. (line 6) * switching schemes: The source and the REPL. (line 103) * switching to module: The source and the REPL. (line 91) * switching to REPL: The source and the REPL. (line 87) * switching to source: The source and the REPL. (line 87) * thanks: No hacker is an island. (line 6) * timeout: Customization and tips. (line 65) * to err is schemey: To err perchance to debug. (line 6) * use the source, Luke: From the source's mouth. (line 9) * useless wretch: Activating Geiser. (line 43) * Version checking: Customization and tips. (line 38) * versions supported: Must needs. (line 6)  Tag Table: Node: Top883 Node: Introduction3339 Node: Modus operandi3673 Ref: current-module4328 Node: Showing off5801 Node: Installation7079 Node: Must needs7292 Node: The easy and quick way8116 Node: From the source's mouth9894 Node: Friends13584 Ref: paredit13858 Node: The REPL15270 Ref: quick-start15389 Node: Starting the REPL15780 Node: First aids20126 Node: Switching context21959 Node: Completion and error handling23884 Node: Autodoc and friends25521 Ref: repl-mod27591 Node: Seeing is believing28597 Node: Customization and tips29609 Ref: choosing-impl30338 Ref: active-implementations30466 Ref: impl-binary30847 Node: Between the parens34757 Node: Activating Geiser35819 Node: The source and the REPL38429 Ref: repl-association39473 Ref: switching-repl-buff42741 Node: Documentation helpers44426 Ref: doc-browser48694 Node: To eval or not to eval51421 Node: To err perchance to debug55248 Node: Jumping around57610 Node: Geiser writes for you58887 Node: Cheat sheet61047 Node: Scheme buffers61431 Node: REPL65357 Node: Documentation browser67616 Node: No hacker is an island68684 Node: Index71869  End Tag Table geiser-0.8.1/doc/texinfo.tex0000644000175000017500000110035111623601336012664 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2009-08-14.15} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% Math-mode def from plain.tex. \let\ptexraggedright=\raggedright % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html % (and related messages, the final outcome is that it is up to the TeX % user to double the backslashes and otherwise make the string valid, so % that's what we do). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\undefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % emacs-page end of cmaps % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% \wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqsamp \markupsetnoligaturesquoteleft \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}} \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } \message{glyphs,} % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control% words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\expansion \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{% \ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% \hbox to 0pt{}% \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \def\quotationstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } \envdef\quotation{% \setnormaldispenv \quotationstart } \envdef\smallquotation{% \setsmalldispenv \quotationstart } \let\Esmallquotation = \Equotation % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a minor refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. On the other hand, if % it's at the top level, we don't want the normal paragraph indentation. \noindent % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip \fi % space after the standalone image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guilletright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore geiser-0.8.1/doc/dir0000644000175000017500000000115212177735671011204 00000000000000This is the file .../info/dir, which contains the topmost node of the Info hierarchy, called (dir)Top. The first time you invoke Info you start off looking at this node.  File: dir, Node: Top This is the top of the INFO tree This (the Directory node) gives a menu of major topics. Typing "q" exits, "?" lists all Info commands, "d" returns here, "h" gives a primer for first-timers, "mEmacs" visits the Emacs manual, etc. In Emacs, you can click mouse button 2 on a menu item or cross reference to select it. * Menu: Emacs * Geiser: (geiser). Emacs environment for Scheme hacking. geiser-0.8.1/doc/macros.texi0000644000175000017500000000242112607251153012644 00000000000000@set VERSION 0.8.1 @set VERSION_NICK @set RELEASE_DATE October 2015 @set GUILE_VERSION 2.0.9 @set RACKET_VERSION 6.0 @set CHICKEN_VERSION 4.8.0 @set EMACS_VERSION 23.2 @set DOWN_BASE http://download-mirror.savannah.gnu.org/@/releases/@/geiser @set PACKAGE_REPO @value{DOWN_BASE}/@/packages @set PACKAGE @value{PACKAGE_REPO}/@/geiser-@value{VERSION}.tar @set TARBALL geiser-@value{VERSION}.tar.gz @macro downfile{FILE, CAPT} @uref{@value{DOWN_BASE}/@/@value{VERSION}/@/\FILE\, \CAPT\} @end macro @macro vblurb{GVERS, CVERS, RVERS, DATE} @html
@end html @downfile{@value{TARBALL}, Version @value{VERSION} @value{VERSION_NICK} (\DATE\) Guile \GVERS\+ Chicken \CVERS\+ and Racket \RVERS\+} @html
@end html @end macro @macro dvblurb{} @vblurb{@value{GUILE_VERSION}, @value{CHICKEN_VERSION}, @value{RACKET_VERSION}, @value{RELEASE_DATE}} @end macro @macro altr{LINK, TXT, TLINK, TRAIL} @ifhtml @ref{\LINK\,,\TXT\}\TRAIL\ @end ifhtml @ifinfo @pxref{\LINK\,\TXT\}\TRAIL\ @end ifinfo @iftex @ref{\TLINK\}\TRAIL\ @end iftex @end macro @macro img{FILE, ALIGN} @ifhtml @html @end html @end ifhtml @end macro @macro imgc{FILE} @ifhtml @html @end html @end ifhtml @end macro geiser-0.8.1/doc/parens.texi0000644000175000017500000006735112466000452012662 00000000000000@node Between the parens, Cheat sheet, The REPL, Top @chapter Between the parens A good REPL is a must, but just about half the story of a good Scheme hacking environment. Well, perhaps a bit more than a half; but, at any rate, one surely needs also a pleasant way of editing source code. Don't pay attention to naysayers: Emacs comes with an excellent editor included for about any language on Earth, and just the best one when that language is sexpy (especially if you use @ifhtml @ref{paredit,,Paredit}). @end ifhtml @ifnothtml Paredit). @end ifnothtml Geiser's support for writing Scheme code adds to Emacs' @code{scheme-mode}, rather than supplanting it; and it does so by means of a minor mode (unimaginatively dubbed @code{geiser-mode}) that defines a bunch of new commands to try and, with the help of the same Scheme process giving you the REPL, make those Scheme buffers come to life. @menu * Activating Geiser:: * The source and the REPL:: * Documentation helpers:: * To eval or not to eval:: * To err perchance to debug:: * Jumping around:: * Geiser writes for you:: @end menu @node Activating Geiser, The source and the REPL, Between the parens, Between the parens @section Activating Geiser @cindex geiser-mode @img{geiser-mode, right} With Geiser installed following any of the procedures described in @ref{The easy and quick way} or @ref{From the source's mouth}, Emacs will automatically activate @i{geiser-mode} when opening a Scheme buffer. Geiser also instructs Emacs to consider files with the extension @file{rkt} part of the family, so that, in principle, there's nothing you need to do to ensure that Geiser's extensions will be available, out of the box, when you start editing Scheme code. Indications that everything is working according to plan include the 'Geiser' minor mode indicator in your mode-line and the appearance of a new entry for Geiser in the menu bar. If, moreover, the mode-line indicator is the name of a Scheme implementation, you're indeed in a perfect world; otherwise, don't despair and keep on reading: i'll tell you how to fix that in a moment. @cindex geiser-mode commands The menu provides a good synopsis of everything Geiser brings to the party, including those keyboard shortcuts we Emacsers love. If you're seeing the name of your favourite Scheme implementation in the mode-line, have a running REPL and are comfortable with Emacs, you can stop reading now and, instead, discover Geiser's joys by yourself. I've tried to make Geiser as self-documenting as any self-respecting Emacs package should be. If you follow this route, make sure to take a look at Geiser's customization buffers (@kbd{M-x customize-group @key{RET} geiser}): there's lot of fine-tuning available there. You might also want to take a glance at @ifhtml our @ref{Cheat sheet,,cheat sheet}. @end ifhtml @ifnothtml the tables in @pxref{Cheat sheet, our cheat sheet}. @end ifnothtml Since @i{geiser-mode} is a minor mode, you can toggle it with @kbd{M-x geiser-mode}, and control its activation in hooks with the functions @code{turn-on-geiser-mode} and @code{turn-off-geiser-mode}. If, for some reason i cannot fathom, you prefer @i{geiser-mode} not to be active by default, customizing @code{geiser-mode-auto-p} to @code{nil} will do the trick. @cindex scheme file extensions And if you happen to use a funky extension for your Scheme files that is not recognised as such by Emacs, just tell her about it with: @example (add-to-list 'auto-mode-alist '("\\.funky-extension\\'" . scheme-mode)) @end example @cindex useless wretch Now, @i{geiser-mode} is just a useless wretch unless there's a running Scheme process backing it up. Meaning that virtually all the commands it provides require a REPL up and running, preferably corresponding to the correct Scheme implementation. In the following section, we'll see how to make sure that that's actually the case. @node The source and the REPL, Documentation helpers, Activating Geiser, Between the parens @section The source and the REPL As i've already mentioned a couple of times, @i{geiser-mode} needs a running REPL to be operative. Thus, a common usage pattern will be for you to first call @code{run-geiser} @ifhtml (or @ref{choosing-impl,,one of its variants}), @end ifhtml @ifnothtml (or one of its variants, e.g. @code{run-guile}), @end ifnothtml and then open some Scheme files; but there's nothing wrong in first opening a couple Scheme buffers and then starting the REPL (you can even find it more convenient, since pressing @kbd{C-c C-z} in a Scheme buffer will start the REPL for you). Since Geiser supports more than one Scheme implementation, though, there's the problem of knowing which of them is to be associated with each Scheme source file. Serviceable as it is, @i{geiser-mode} will try to guess the correct implementation for you, according to the algorithm described below. @ifhtml If you find that Geiser is already guessing right the Scheme implementation, feel free to skip to the @ref{switching-repl-buff,,next subsection}. @end ifhtml @subsubheading How Geiser associates a REPL to your Scheme buffer @cindex scheme implementation, choosing @anchor{repl-association} To determine what Scheme implementation corresponds to a given source file, Geiser uses the following algorithm: @enumerate @item If the file-local variable @code{geiser-scheme-implementation} is defined, its value is used. A common way of setting buffer-local variables is to put them in a comment near the beginning of the file, surrounded by @code{-*-} marks, as in: @example ;; -*- geiser-scheme-implementation: guile -*- @end example @item If you've customized @code{geiser-active-implementations} so that it's a single-element @ifhtml list (as explained in @ref{choosing-impl,,here}), @end ifhtml @ifnothtml list, @end ifnothtml that element is used as the chosen implementation. @item The contents of the file is scanned for hints on its associated implementation. For instance, files that contain a @code{#lang} directive will be considered Racket source code, while those with a @code{define-module} form in them will be assigned to a Guile REPL. @item The current buffer's file name is checked against the rules given in @code{geiser-implementations-alist}, and the first match is applied. You can provide your own rules by customizing this variable, as explained below. @item If we haven't been lucky this far and you have customized @code{geiser-default-implementation} to the name of a supported implementation, we'll follow your lead. @item See? That's the problem of being a smart aleck: one's always outsmarted by people around. At this point, @i{geiser-mode} will humbly give up and ask you to explicitly choose the Scheme implementation. @end enumerate As you can see in the list above, there are several ways to influence Geiser's guessing by means of customizable variables. The most direct (and most impoverishing) is probably limiting the active implementations to a single one, while customizing @code{geiser-implementations-alist} is the most flexible (and, unsurprisingly, also the most complex). Here's the default value for the latter variable: @example (((regexp "\\.scm$") guile) ((regexp "\\.ss$") racket) ((regexp "\\.rkt$") racket)) @end example @noindent which describes the simple heuristic that files with @file{.scm} as extension are by default associated to a Guile REPL while those ending in @file{.ss} or @file{.rkt} correspond to Racket's implementation (with the caveat that these rules are applied only if the previous heuristics have failed to detect the correct implementation, and that they'll match only if the corresponding implementation is active). You can add rules to @code{geiser-implementations-alist} (or replace all of them) by customizing it. Besides regular expressions, you can also use a directory name; for instance, the following snippet: @example (eval-after-load "geiser-impl" '(add-to-list 'geiser-implementations-alist '((dir "/home/jao/prj/frob") guile))) @end example @noindent will add a new rule that says that any file inside my @file{/home/jao/prj/frob} directory (or, recursively, any of its children) is to be assigned to Guile. Since rules are first matched, first served, this new rule will take precedence over the default ones. @cindex autostart REPL @cindex start REPL, automatically A final tip: if you want Geiser to start automatically a REPL for you if it notices that there's no one active when it enters @i{geiser-mode}, you can customize @code{geiser-mode-start-repl-p} to @code{t}. @subsubheading Switching between source files and the REPL @cindex switching to REPL @cindex switching to source @anchor{switching-repl-buff} Once you have a working @i{geiser-mode}, you can switch from Scheme source buffers to the REPL or @kbd{C-c C-z}. Those shortcuts map to the interactive command @code{switch-to-geiser}. @cindex switching to module If you use a numeric prefix, as in @kbd{C-u C-c C-z}, besides being teleported to the REPL, the latter will switch to the namespace of the Scheme source file, as if you had used @kbd{C-c C-m} in the REPL, with the source file's module as argument; cf. discussion in @altr{Switching context,,Switching context,. This} command is also bound to @kbd{C-c C-a}. Once you're in the REPL, the same @kbd{C-c C-z} shortcut will bring you back to the buffer you jumped from, provided you don't kill the Scheme process in between. This is why the command is called @i{switch-to-geiser} instead of @i{switch-to-repl}, and what makes it really handy, if you ask me. @cindex switching schemes If for some reason you're not happy with the Scheme implementation that Geiser has assigned to your file, you can change it with @kbd{C-c C-s}, and you probably should take a look at @ifhtml @ref{repl-association,,the previous subsection} @end ifhtml @ifnothtml the previous subsection @end ifnothtml to make sure that Geiser doesn't get confused again. @subsubheading A note about context As explained before (@pxref{Modus operandi}), all Geiser activities take place in the context of the @i{current namespace}, which, for Scheme buffers, corresponds to the module that the Scheme implementation associates to the source file at hand (for instance, in Racket, there's a one-to-one correspondence between paths and modules, while Guile relies on explicit @code{define-module} forms in the source file). Now that we have @code{geiser-mode} happily alive in our Scheme buffers and communicating with the right REPL instance, let us see what it can do for us, besides jumping to and fro. @node Documentation helpers, To eval or not to eval, The source and the REPL, Between the parens @section Documentation helpers @subsubheading Autodoc redux @cindex autodoc, in scheme buffers The first thing you will notice by moving around Scheme source is that, every now and then, the echo area lights up with the same autodoc messages we know and love from our REPL forays. This happens every time the Scheme process is able to recognise an identifier in the buffer, and provide information either on its value (for variables) or on its arity and the name of its formal arguments (for procedures and macros). That information will only be available if the module the identifier belongs to has been loaded in the running Scheme image. So it can be the case that, at first, no autodoc is shown for identifiers defined in the file you're editing. But as soon as you evaluate them (either individually or collectively using any of the devices described in @ref{To eval or not to eval}) their signatures will start appearing in the echo area. @cindex disabling autodoc @cindex manual autodoc Autodoc activation is controlled by a minor mode, @code{geiser-autodoc}, which you can toggle with @kbd{M-x geiser-autodoc-mode}, or its associated keyboard shortcut, @kbd{C-c C-d a}. That @t{/A} indicator in the mode-line is telling you that autodoc is active. If you prefer that it be inactive by default (e.g., because you're connecting to a really remote scheme and want to minimize network exchanges), just set @code{geiser-mode-autodoc-p} to @code{nil} in your customization files. Even when autodoc mode is off, you can use @code{geiser-autodoc-show}, bound by default to @kbd{C-c C-d s}, to show the autodoc string for the symbol at point. @cindex autodoc explained @img{autodoc-scm, right} The way autodoc displays information deserves some explanation. It will first show the name of the module where the identifier at hand is defined, followed by a colon and the identifier itself. If the latter corresponds to a procedure or macro, it will be followed by a list of argument names, starting with the ones that are required. Then there comes a list of optional arguments, if any, enclosed in parentheses. When an optional argument has a default value (or a form defining its default value), autodoc will display it after the argument name. When the optional arguments are keywords, their names are prefixed with ``#:'' (i.e., their names @i{are} keywords). An ellipsis (@dots{}) serves as a marker of an indeterminate number of parameters, as is the case with @i{rest} arguments or when autodoc cannot fathom the exact number of arguments (this is often the case with macros defined using @code{syntax-case}). Another way in which autodoc displays its ignorance is by using an underscore to display parameters whose name is beyond its powers. @img{autodoc-multi, right} It can also be the case that a function or macro has more than one signature (e.g., functions defined using @code{case-lambda}, or some @code{syntax-rules} macros, for which Geiser has often the black magic necessary to retrieve their actual arities). In those cases, autodoc shows all known signatures (using the above rules for each one) separated by a vertical bar (|). As you have already noticed, the whole autodoc message is enclosed in parentheses. After all, we're talking about Scheme here. @cindex autodoc for variables @img{autodoc-var, right} Finally, life is much easier when your cursor is on a symbol corresponding to a plain variable: you'll see in the echo area its name, preceded by the module where it's defined, and followed by its value, with an intervening arrow for greater effect. This time, there are no enclosing parentheses (i hope you see the logic in my madness). @cindex autodoc customized You can change the way Geiser displays the module/identifier combo by customizing @code{geiser-autodoc-identifier-format}. For example, if you wanted a tilde surrounded by spaces instead of a colon as a separator, you would write something like: @example (setq geiser-autodoc-identifier-format "%s ~ %s") @end example @noindent in your Emacs initialisation files. There's also a face (@code{geiser-font-lock-autodoc-identifier}) that you can customize (for instance, with @kbd{M-x customize-face}) to change the appearance of the text. And another one (@code{geiser-font-lock-autodoc-current-arg}) that controls how the current argument position is highlighted. @subsubheading Other documentation commands @anchor{doc-browser}Sometimes, autodoc won't provide enough information for you to understand what a function does. In those cases, you can ask Geiser to ask the running Scheme for further information on a given identifier or module. @cindex documentation for symbol @cindex docstrings, maybe For symbols, the incantation is @kbd{M-x geiser-doc-symbol-at-point}, or @kbd{C-c C-d C-d} for short. If the associated Scheme supports docstrings (as, for instance, Guile does), you'll be teleported to a new Emacs buffer displaying Geiser's documentation browser, filled with information about the identifier, including its docstring (if any; unfortunately, that an implementation supports docstrings doesn't mean that they're used everywhere). @imgc{docstring} Pressing @kbd{q} in the documentation buffer will bring you back, enlightened, to where you were. There's also a handful of other navigation commands available in that buffer, which you can discover by means of its menu or via the good old @kbd{C-h m} command. And feel free to use the navigation buttons and hyperlinks that justify my calling this buffer a documentation browser. For Racket, which does not support docstrings out of the box, this command will provide less information, but the documentation browser will display the corresponding contract when it's available, as well as some other tidbits for re-exported identifiers. @imgc{docstring-racket} You can also ask Geiser to display information about a module, in the form of a list of its exported identifiers, using @kbd{C-c C-d C-m}, exactly as you would do in @altr{repl-mod,the REPL,The REPL,.} In both cases, the documentation browser will show a couple of buttons giving you access to further documentation. First, you'll see a button named @i{source}: pressing it you'll jump to the symbol's definition. The second button, dubbed @i{manual}, will open the Scheme implementation's manual page for the symbol at hand. For Racket, that will open your web browser displaying the corresponding reference's page (using the HTML browser in Racket's configuration, which you can edit in DrRacket's preferences dialog, or by setting @code{plt:framework-pref:external-browser} directly in @file{~/.racket/racket-prefs.rktd}), while in Guile a lookup will be performed in the texinfo manual. @cindex Guile info nodes For Guile, the manual lookup uses the info indexes in the standard Guile info nodes, which are usually named ``guile'' or ``guile-2.0''. If yours are named differently, just add your name to the customizable variable @code{geiser-guile-manual-lookup-nodes}. A list of all navigation commands in the documentation browser is available in @altr{Documentation browser,our cheat-sheet,Documentation browser,.} @cindex opening manual pages You can also skip the documentation browser and jump directly to the manual page for the symbol at point with the command @code{geiser-doc-look-up-manual}, bound to @kbd{C-c C-d i}. @node To eval or not to eval, To err perchance to debug, Documentation helpers, Between the parens @section To eval or not to eval @cindex philosophy @cindex incremental development One of Geiser's main goals is to facilitate incremental development. You might have noticed that i've made a big fuss of Geiser's ability to recognize context, by being aware of the namespace where its operations happen. That awareness is especially important when evaluating code in your scheme buffers, using the commands described below. They allow you to send code to the running Scheme with a granularity ranging from whole files to single s-expressions. That code will be evaluated in the module associated with the file you're editing, allowing you to redefine values and procedures to your heart's (and other modules') content. @cindex incremental development, evil Macros are, of course, another kettle of fish: one needs to re-evaluate uses of a macro after redefining it. That's not a limitation imposed by Geiser, but a consequence of how macros work in Scheme (and other Lisps). There's also the risk that you lose track of what's actually defined and what's not during a given session. But, @uref{http://programming-musings.org/@/2009/03/29/@/from-my-cold-prying-hands/,in my opinion}, those are limitations we lispers are aware of, and they don't force us to throw the baby with the bathwater and ditch incremental evaluation. Some people disagree; if you happen to find @uref{http://blog.racket-lang.org/@/2009/@/03/@/drscheme-repl-isnt-lisp.html, their arguments} convincing, you don't have to throw away Geiser together with the baby: @kbd{M-x geiser-restart-repl} will let you restart the REPL as many times as you see fit. @cindex evaluation @cindex incremental development, not evil For all of you bearded old lispers still with me, here are some of the commands performing incremental evaluation in Geiser. @code{geiser-eval-last-sexp}, bound to @kbd{C-x C-e}, will eval the s-expression just before point. If you use a prefix, as in @kbd{C-u C-x C-e}, besides evaluating it the expression is inserted in the the buffer. @code{geiser-eval-definition}, bound to @kbd{C-M-x}, finds the topmost definition containing point and sends it for evaluation. The variant @code{geiser-eval-definition-and-go} (@kbd{C-c M-e}) works in the same way, but it also teleports you to REPL after the evaluation. @code{geiser-eval-region}, bound to @kbd{C-c C-r}, evals the current region. Again, there's an @i{and-go} version available, @code{geiser-eval-region-and-go}, bound to @kbd{C-c M-r}. And, if you want to extend the evaluated region to the whole buffer, there is @code{geiser-eval-buffer}, bound to @kbd{C-c C-b} and its companion @code{geiser-eval-buffer-and-go}, bound to @kbd{C-c M-b}. @cindex evaluating images @cindex image display For all the commands above, the result of the evaluation is displayed in the minibuffer, unless it causes a (Scheme-side) error (@pxref{To err perchance to debug}), or, for schemes supporting them (such as Racket), the evaluation yields an image, in which case you'll see it in popping up in the Geiser debug buffer (if your Emacs runs under the auspices of a graphical toolkit), or via an external viewer if you set @c{geiser-image-viewer} to the path of an appropriate visualization program (see also @ref{Seeing is believing} for more on image support). At the risk of repeating myself, i'll remind you that all these evaluations will take place in the namespace of the module corresponding to the Scheme file from which you're sending your code, which, in general, will be different from the REPL's current module. And, if all goes according to plan, (re)defined variables and procedures should be immediately visible inside and, if exported, outside their module. Besides evaluating expressions, definitions and regions, you can also macro-expand them. The corresponding key bindings start with the prefix @kbd{C-c C-m} and end, respectively, with @kbd{C-e}, @kbd{C-x} and @kbd{C-r}. The result of the macro expansion always appears in a pop up buffer. @node To err perchance to debug, Jumping around, To eval or not to eval, Between the parens @section To err: perchance to debug @cindex to err is schemey @cindex backtraces When an error occurs during evaluation, it will be reported according to the capabilities of the underlying Scheme REPL. @cindex error buffer In Racket, you'll be presented with a backtrace, in a new buffer where file paths locating the origin of the error are click-able (you can navigate them using the @key{TAB} key, and use @key{RET} or the mouse to jump to the offending spot; or invoke Emacs' stock commands @code{next-error} and @code{previous-error}, bound to @kbd{M-g n} and @kbd{M-g p} by default). @imgc{eval-error} The Racket backtrace also highlights the exception type, making it click-able. Following the link will open the documentation corresponding to said exception type. Both the error and exception link faces are customizable (@code{geiser-font-lock-error-link} and @code{geiser-font-lock-doc-link}). By default, Geiser will tele-transport your pointer to the debug buffer: if you prefer to stay in the source buffer, set @code{geiser-debug-jump-to-debug-p} to nil. And if, in addition, you don't even want to see the error trace, customize @code{geiser-debug-show-debug-p}, again, to nil. On the other hand, Guile's reaction to evaluation errors is different: it enters the debugger in its REPL. Accordingly, the REPL buffer will pop up if your evaluation fails in a Guile file, and the error message and backtrace will be displayed in there, again click-able and all. But there you have the debugger at your disposal, with the REPL's current module set to that of the offender, and a host of special debugging commands that are described in Guile's fine documentation. @imgc{guile-eval-error} In addition, Guile will sometimes report warnings for otherwise successful evaluations. In those cases, it won't enter the debugger, and Geiser will report the warnings in a debug buffer, as it does for Racket. You can control how picky Guile is reporting warnings by customizing the variable @code{geiser-guile-warning-level}, whose detailed docstring (which see, using, e.g. @kbd{C-h v}) allows me to offer no further explanation here. The customization group @i{geiser-guile} is also worth a glance, for a couple of options to fine-tune how Geiser interacts with Guile's debugger (and more). Same thing for racketeers and @i{geiser-racket}. @node Jumping around, Geiser writes for you, To err perchance to debug, Between the parens @section Jumping around @cindex jumping in scheme buffers This one feature is as sweet as it is easy to explain: @kbd{M-.} (@code{geiser-edit-symbol-at-point}) will open the file where the identifier around point is defined and land your point on its definition. To return to where you were, press @kbd{M-,} (@code{geiser-pop-symbol-stack}). This command works also for module names: Geiser first tries to locate a definition for the identifier at point and, if that fails, a module with that name; if the latter succeeds, the file where the module is defined will pop up. Sometimes, the underlying Scheme will tell Geiser only the file where the symbol is defined, but Geiser will use some heuristics (read, regular expressions) to locate the exact line and bring you there. Thus, if you find Geiser systematically missing your definitions, send a message to the @email{geiser-users@@nongnu.org, mailing list}, and we'll try to make the algorithm smarter. @cindex jumping customized You can control how the destination buffer pops up by setting @code{geiser-edit-symbol-method} to either @code{nil} (to open the file in the current window), @code{'window} (other window in the same frame) or @code{'frame} (in a new frame). @node Geiser writes for you, , Jumping around, Between the parens @section Geiser writes for you @cindex completion in scheme buffers No self-respecting programming mode would be complete without completion. In geiser-mode, identifier completion is bound to @kbd{M-@key{TAB}}, and will offer all visible identifiers starting with the prefix before point. Visible here means all symbols imported or defined in the current namespace plus locally bound ones. E.g., if you're at the end of the following partial expression: @example (let ((default 42)) (frob def @end example @noindent and press @kbd{M-@key{TAB}}, one of the possible completions will be @code{default}. @cindex partial completion After obtaining the list of completions from the running Scheme, Geiser uses the standard Emacs completion machinery to display them. That means, among other things, that partial completion is available: just try to complete @code{d-s} or @code{w-o-t-s} to see why this is a good thing. Partial completion won't work if you have disabled it globally in your Emacs configuration: if you don't know what i'm talking about, never mind: Geiser's partial completion will work for you out of the box. @cindex smart tabs If you find the @kbd{M} modifier annoying, you always have the option to activate @code{geiser-smart-tab-mode}, which will make the @key{TAB} key double duty as the regular Emacs indentation command (when the cursor is not near a symbol) and Geiser's completion function. If you want this smarty pants mode always on in Scheme buffers, customize @code{geiser-mode-smart-tab-p} to @code{t}. @cindex completion for module names Geiser also knows how to complete module names: if no completion for the prefix at point is found among the currently visible bindings, it will try to find a module name that matches it. You can also request explicitly completion only over module names using @kbd{M-`} (that's a backtick). Besides completion, there's also this little command, @code{geiser-squarify}, which will toggle the delimiters of the innermost list around point between round and square brackets. It is bound to @kbd{C-c C-e [}. With a numeric prefix (as in, say, @kbd{M-2 C-c C-e [}), it will perform that many toggles, forward for positive values and backward for negative ones. @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/doc/Makefile.am0000644000175000017500000000217312177773057012543 00000000000000# Copyright (C) 2010 Jose Antonio Ortega Ruiz # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # SUBDIRS = img SUFFIXES = .html info_TEXINFOS = geiser.texi geiser_TEXINFOS = \ macros.texi \ top.texi \ intro.texi \ install.texi \ repl.texi \ parens.texi \ cheat.texi \ thanks.texi \ index.texi output_dir=$(top_builddir)/doc/html web: rm -f $(output_dir)/*.html texi2html --output=$(output_dir) \ --split=chapter \ --noheader \ --nonumber-section \ --init-file=$(top_srcdir)/doc/site.conf \ --top-file=index.html \ $(top_srcdir)/doc/web.texi cp $(top_srcdir)/doc/geiser.css ${output_dir} cp -r $(top_srcdir)/doc/img ${output_dir} EXTRA_DIST = dir geiser-0.8.1/doc/install.texi0000644000175000017500000002162612563407730013043 00000000000000@node Installation, The REPL, Introduction, Top @chapter Installation @menu * Must needs:: * The easy and quick way:: * From the source's mouth:: * Friends:: @end menu @node Must needs, The easy and quick way, Installation, Installation @section Must needs @cindex supported versions @cindex versions supported If Geiser came with any guarantees, you'd break all of them by not using GNU Emacs @value{EMACS_VERSION} (or better: i regularly use it with a recent Emacs snapshot) and at least one of the supported Schemes, namely: @itemize @bullet @item @uref{http://www.racket-lang.org, Racket} @value{RACKET_VERSION} or better @item @uref{http://www.gnu.org/software/guile, Guile} @value{GUILE_VERSION} or better @item @uref{http://call-cc.org, Chicken} @value{CHICKEN_VERSION} or better @end itemize Since Geiser supports multiple REPLs, having both of them will just add to the fun. You'll also need Geiser itself. The quickest installation is via its ELPA package, as described in the next section. If you prefer to use the source code directly, it's not that difficult either: just keep on reading. @node The easy and quick way, From the source's mouth, Must needs, Installation @section The easy and quick way @cindex quick install @cindex ELPA Did i mention that the easiest way of installing Geiser is using its @uref{http://emacswiki.org/emacs/ELPA, ELPA} package? If you're using Emacs 24, @uref{http://emacswiki.org/emacs/ELPA, ELPA} is already there; for earlier versions, the page i just linked to twice will tell you where to find the goodies. ELPA packages live in repositories accessible via HTTP. You can find Geiser's package in either @uref{http://melpa-stable.org/#/geiser, MELPA stable} or, if you like living on the bleeding edge, @uref{http://melpa.org/#/geiser, MELPA} (directly from the git repo). To tell Emacs that an ELPA repo exists, you add it to @code{package-archives}: @example (require 'package) ;;; either the stable version: (add-to-list 'package-archives ;; choose either the stable or the latest git version: ;; '("melpa-stable" . "http://melpa-stable.org/packages/") '("melpa-unstable" . "http://melpa.org/packages/")) (package-initialize) @end example And then installing Geiser is as easy as: @example M-x package-install RET geiser RET @end example Alternatively, you can manually download the @uref{@value{PACKAGE}, package file}, and install from your local disk with @kbd{M-x package-install-file}. @cindex Chicken @cindex Chicken installation If you plan to use Chicken, you'll need also to fire a terminal and configure a couple of Chicken eggs: @example $ chicken-install -s apropos chicken-doc $ cd `csi -p '(chicken-home)'` $ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx @end example With that, you are pretty much all set up. See @ref{The REPL} to start using Geiser. @ifnotinfo And, by the way, if you prefer to keep reading this manual within Emacs, @kbd{C-h i m Geiser RET} will bring you to the info version of it that you just installed! @end ifnotinfo @node From the source's mouth, Friends, The easy and quick way, Installation @section Installing from source @subsubheading Downloading Geiser @cindex use the source, Luke The latest release tarball can be found @downfile{, here}. Just download @downfile{@value{TARBALL}, @value{TARBALL}} and untar it in a directory of your choice. If you feel like living on the bleeding edge, just grab Geiser from its Git repository @uref{http://git.savannah.nongnu.org/cgit/geiser.git/, over at Savannah}, either with the following incantation: @example git clone git://git.sv.gnu.org/geiser.git @end example @noindent or, if you happen to live behind a firewall, with the alternative: @example git clone http://git.sv.gnu.org/r/geiser.git @end example @noindent You can also follow Geiser's development in @uref{https://github.com/jaor/geiser, one} @uref{http://repo.or.cz/w/geiser.git, or} @uref{http://gitorious.org/geiser, three} mirrors that are kept synchronized with the one at Savannah. Either way, you'll now be in possession of a copy of Geiser's libre code. I'll follow you into its directory and the next section. @subsubheading Setting it up Geiser is ready to be used out of the box without much more ado. For the sake of concreteness, let's assume you put its source in the directory @file{~/lisp/geiser}. All you need to do is to add the following line to your Emacs initialisation file (be it @file{~/.emacs} or any of its moral equivalents): @example (load-file "~/lisp/geiser/elisp/geiser.el") @end example @noindent or simply evaluate that form inside Emacs (you wouldn't kill a friend just to start using Geiser, would you?). That's it: you're ready to @ifhtml @ref{quick-start,,go}. @end ifhtml @ifnothtml go (@pxref{The REPL}). @end ifnothtml @ifnotinfo If you obtained the Geiser source tree from a release tarball, you can even continue to read this fine manual inside Emacs by opening @file{doc/geiser.info} using @kbd{C-u C-h i}. The manual is also available in PDF format @downfile{geiser-manual-@value{VERSION}.pdf, here}. @end ifnotinfo @cindex byte-compilation What? You still here? I promise the above is all that's needed to start using Geiser. But, in case you are missing your @t{configure/make all install} routine, by all means, you can go through those motions to byte compile and install Geiser too. That is, you enter the source directory and (since we grabbed the development tree) run the customary @i{autogen} script: @example $ cd ~/lisp/geiser $ ./autogen.sh @end example @noindent I recommend that you compile Geiser in a separate directory: @example $ mkdir build && cd build $ ../configure $ make all @end example Now you have two options: loading the byte-compiled Geiser from the @file{elisp} subdirectory, or installing it system-wide. To load the byte-code from here, add this line to your initialisation file: @example (load "~/lisp/geiser/build/elisp/geiser-load") @end example @noindent and eval that form and you're done (you could also restart Emacs, but killing your friends is widely considered bad form). Yes, that's @code{load} and @file{geiser-load} instead of @code{load-file} and @file{geiser.el}. If you prefer a system-wide installation, just type: @example $ sudo make install @end example With the above spell, Geiser will be compiled and installed in a safe place inside Emacs load path. To load it into Emacs you'll need, @i{instead} of the @code{load-file} form above, the following line in your initialisation file: @example (require 'geiser-install) @end example @noindent Please note that we're requiring @code{geiser-install}, and @i{not} @code{geiser}, and that there's no @code{load-file} to be seen this time. There are some ways of fine-tuning this process, mainly by providing additional arguments in the call to @t{configure}: you'll find those gory details in the file called @file{INSTALL}, right at the root of the source tree. The installation will also take care of placing this manual, in Info format, where Emacs can find it, so you can continue to learn about Geiser inside its natural habitat. See you there and into the next chapter! @node Friends, , From the source's mouth, Installation @section Friends Although Geiser does not need them, it plays well with (and is enhanced by) the following Emacs packages: @cindex ac-geiser @cindex autocomplete @cindex paredit @cindex company @cindex quack @itemize @bullet @item @uref{http://www.emacswiki.org/emacs/ParEdit, Paredit}. @anchor{paredit} Regardless of whether you use Geiser or not, you shouldn't be coding in any Lisp dialect without the aid of Taylor Campbell's structured editing mode. @item @uref{http://company-mode.github.io/, Company}. Nikolaj Schumacher's and Dmitry Gutov's @code{company-mode} provides a generic front-end for completion engines (such as Geiser's), with pretty and automatic completion lists. @item @uref{https://github.com/xiaohanyu/ac-geiser/, ac-geiser} If you prefer @code{auto-complete-mode} to @code{company-mode}, Xiao Hanyu's @code{ac-geiser}, which provides a Geiser plugin for the popular @uref{http://cx4a.org/software/auto-complete/, Emacs Auto Completion Mode}, is the package for you. Like Geiser, @code{ac-geiser} is available in Marmalade and MELPA, and also as an @code{el-get} package. @item @uref{http://www.neilvandyke.org/quack/, Quack}. You can still use the many goodies provided by Neil van Dyke's @code{quack-mode}, since most of them are not (yet) available in Geiser. The only caveat might be a conflict between Quack's and Geiser's default key bindings, which i'm sure you'll manage to tackle just fine. It's also probably a good idea to require @code{quack} @i{after} loading @file{geiser.el} (or requiring a compiled version). @end itemize @noindent You just need to install and setup them as usual, for every package's definition of usual. Geiser will notice their presence and react accordingly. @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/doc/top.texi0000644000175000017500000000202211623601336012156 00000000000000Geiser is a collection of Emacs major and minor modes that conspire with one or more Scheme interpreters to keep the Lisp Machine Spirit alive. It draws inspiration (and a bit more) from environments such as Common Lisp's Slime, Factor's FUEL, Squeak or Emacs itself, and does its best to make Scheme hacking inside Emacs (even more) fun. @cindex derailment @cindex corpses @cindex philosophy Or, to be precise, what @uref{http://hacks-galore.org/jao, i} consider fun. Geiser is thus my humble contribution to the dynamic school of expression, and a reaction against what i perceive as a derailment, in modern times, of standard Scheme towards the static camp. Because i prefer growing and healing to poking at corpses, the continuously running Scheme interpreter takes the center of the stage in Geiser. A bundle of Elisp shims orchestrates the dialog between the Scheme interpreter, Emacs and, ultimately, the schemer, giving her access to live metadata. Here's how. @c Local Variables: @c mode: texinfo @c TeX-master: geiser @c End: geiser-0.8.1/doc/thanks.texi0000644000175000017500000000634312606675540012670 00000000000000@node No hacker is an island, Index, Cheat sheet, Top @chapter No hacker is an island @cindex thanks Dan Leslie, with the help of his three-months old daughter Freija, proved there's a smidgen of sense in this madness by adding support for Chicken to version 0.7 of Geiser, several years after it was born. Andy Wingo, Geiser's first user, has been a continuous source of encouragement and suggestions, and keeps improving Guile and heeding my feature requests. The nice thing about collaborating with Andreas Rottmann over all these years is that he will not only make your project better with insightful comments and prodding: he'll send you patches galore too. Ludovic Courtès, #geiser's citizen no. 1, joined the fun after a while, and has since then been a continuous source of encouragement, ideas and bug reports. Michael Wilber convinced me that image support for Racket was not only fun, but easy, with the best argument: actual code! Daniel Hackney and Grant Rettke created the first ELPA packages for Geiser and taught me to fish. Diogo F. S. Ramos is Geiser's most indefatigable user and bug reporter, and the mailing list has been a far less lonely place since he came. Aleix Conchillo has been my favourite spammer, beta tester and patch sender during more years and for more projects than i can remember. Eduardo Cavazos' contagious enthusiasm has helped in many ways to keep Geiser alive, and he's become its best evangelist in R6RS circles. Alex Kost has contributed with many bug reports and improved Geiser with several patches. Eli Barzilay took the time to play with an early alpha and made many valuable suggestions, besides answering all my 'how do you in PLT' questions. Matthew Flatt, Robby Findler and the rest of the PLT team did not only answer my inquiries, but provided almost instant fixes to the few issues i found. Thanks also to the PLT and Guile communities, for showing me that Geiser was not only possible, but a pleasure to hack on. And to the Slime hackers, who led the way. @subsubheading Joining the fun @itemize @bullet @item @cindex mailing list @cindex gmane For questions, praise, critique and anything else Geiser, do not hesitate to drop an email to our list, @url{mailto:geiser-users@@nongnu.org, (@@ geiser-users (. nongnu org))}: no subscription required. Check @uref{http://lists.nongnu.org/@/mailman/@/listinfo/@/geiser-users, the list page} for more information or browse @uref{http://lists.nongnu.org/@/archive/@/html/@/geiser-users/, the archives}. The list is also accessible via @uref{http://gmane.org, Gmane} as @url{http://dir.gmane.org/@/gmane.lisp.scheme.geiser, gmane.lisp.scheme.geiser}. @item @cindex bug tracker You can submit bug reports either to the mailing list or to @uref{https://github.com/@/jaor/geiser/issues, our bug tracker} over at Github. @item @cindex news feed If you only need to hear about Geiser on new releases, @uref{http://savannah.nongnu.org/@/news/?group=geiser, the News page} and its @uref{https://savannah.nongnu.org/@/news/atom.php?group=geiser, Atom feed} are probably what you're looking for. @item @cindex IRC channel The Freenode IRC channel @i{#geiser} is the Geiserati's meeting point in cyberspace. @end itemize @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/doc/index.texi0000644000175000017500000000047011623601336012470 00000000000000@c This is part of Geiser's user manual. @c Copyright (C) 2010, 2011 Jose Antonio Ortega Ruiz @c See the file geiser.texi for copying conditions. @node Index, , No hacker is an island, Top @unnumbered Index @cindex recursion @printindex cp @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/doc/Makefile.in0000644000175000017500000005616612607252021012544 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2010 Jose Antonio Ortega Ruiz # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/geiser.info am__TEXINFO_TEX_DIR = $(srcdir) DVIS = geiser.dvi PDFS = geiser.pdf PSS = geiser.ps HTMLS = geiser.html TEXINFOS = geiser.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(geiser_TEXINFOS) $(srcdir)/Makefile.in texinfo.tex DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # SUBDIRS = img SUFFIXES = .html info_TEXINFOS = geiser.texi geiser_TEXINFOS = \ macros.texi \ top.texi \ intro.texi \ install.texi \ repl.texi \ parens.texi \ cheat.texi \ thanks.texi \ index.texi output_dir = $(top_builddir)/doc/html EXTRA_DIST = dir all: all-am .SUFFIXES: .SUFFIXES: .html .dvi .info .pdf .ps .texi $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/geiser.info: geiser.texi $(geiser_TEXINFOS) geiser.dvi: geiser.texi $(geiser_TEXINFOS) geiser.pdf: geiser.texi $(geiser_TEXINFOS) geiser.html: geiser.texi $(geiser_TEXINFOS) .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf geiser.t2d geiser.t2p clean-aminfo: -test -z "geiser.dvi geiser.pdf geiser.ps geiser.html" \ || rm -rf geiser.dvi geiser.pdf geiser.ps geiser.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) installdirs: for dir in "$(DESTDIR)$(infodir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-aminfo clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-info-am install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-aminfo mostlyclean-generic pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-aminfo clean-generic \ cscopelist-am ctags-am dist-info distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean mostlyclean-aminfo \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-pdf-am uninstall-ps-am .PRECIOUS: Makefile web: rm -f $(output_dir)/*.html texi2html --output=$(output_dir) \ --split=chapter \ --noheader \ --nonumber-section \ --init-file=$(top_srcdir)/doc/site.conf \ --top-file=index.html \ $(top_srcdir)/doc/web.texi cp $(top_srcdir)/doc/geiser.css ${output_dir} cp -r $(top_srcdir)/doc/img ${output_dir} # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geiser-0.8.1/doc/intro.texi0000644000175000017500000000725612466037620012532 00000000000000@node Introduction, Installation, Top, Top @chapter Introduction Geiser is an Emacs environment to hack and have fun in Scheme. If that's enough for you, see @ref{Installation} to get it running and @ref{The REPL} for the fun part. @menu * Modus operandi:: * Showing off:: @end menu @node Modus operandi, Showing off, Introduction, Introduction @section Modus operandi @cindex modus operandi As already mentioned, Geiser relies on a running Scheme process to obtain the information it makes accessible to the programmer. There's little effort, on the Elisp side, to understand, say, the module system used by the Scheme implementation at hand; instead, a generic interface between the two worlds is defined, and each supported Scheme includes a library implementing that API, together with some wee shims in Elisp allowing the reuse of the Emacs-side framework, which constitutes the bulk of the code. @cindex current module @anchor{current-module} While being as generic as possible, the Scheme-Elisp interface makes some assumptions about the capabilities and interaction mode of the corresponding REPL. In particular, Geiser expects the latter to support namespaces in the form of a module system, and to provide a well-defined way to establish the REPL's current namespace (or module), as well as the current file's module (or namespace). Thus, all evaluations performed by Geiser either in the REPL or in a source code buffer happen in the context of the current namespace. Every time you switch to a different file, you're switching namespaces automatically; at the REPL, you must request the switch explicitly (usually just using means provided by the Scheme implementation itself). If your favourite Scheme supports the above modus operandi, it has all that's needed for a bare-bones Geiser mode. But Geiser can, and will, use any metadata available: procedure arities and argument lists to display interactive help, documentation strings, location information to jump to definitions, export lists to provide completion, and so on and so forth. Although this is not an all-or-none proposition (Geiser can operate with just part of that functionality available), i initially concentrated in supporting those Schemes with the richest (to my knowledge) introspection capabilities, namely, Guile and Racket. Later on, Dan Leslie added support for Chicken, and there's active work to add support for scsh. @node Showing off, , Modus operandi, Introduction @section Showing off @cindex swanking When working with a fully conniving Scheme, Geiser can offer the following functionality: @itemize @bullet @item Form evaluation in the context of the current file's module. @item Macro expansion. @item File/module loading and/or compilation. @item Namespace-aware identifier completion (including local bindings, names visible in the current module, and module names). @item Autodoc: the echo area shows information about the signature of the procedure/macro around point automatically. @item Jump to definition of identifier at point. @item Access to documentation (including docstrings when the implementation provides it). @item Listings of identifiers exported by a given module. @item Listings of callers/callees of procedures. @item Rudimentary support for debugging (when the REPL provides a debugger) and error navigation. @item Support for multiple, simultaneous REPLs. @item Support for image display in those Schemes that treat them as first class values. @end itemize In the following pages, i'll try to explain what these features actually are (i'm just swanking here), and how to use them for your profit. But, before that, let's see how to install Geiser. @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/doc/cheat.texi0000644000175000017500000001407212466000452012446 00000000000000@node Cheat sheet, No hacker is an island, Between the parens, Top @chapter Cheat sheet In the tables below, triple chords always accept a variant with the third key not modified by @key{Control}; e.g., @code{geiser-autodoc-show} is bound both to @kbd{C-c C-d C-s} and @kbd{C-c C-d s}. @menu * Scheme buffers:: * REPL:: * Documentation browser:: @end menu @node Scheme buffers, REPL, Cheat sheet, Cheat sheet @section Scheme buffers @multitable @columnfractions .20 .4 .4 @headitem Key @tab Command @tab Description @item C-c C-z @tab @code{geiser-mode-switch-to-repl} @tab Switch to REPL @item C-c C-a @tab @code{geiser-mode-switch-to-repl-and-enter} @tab Switch to REPL and current module (also @kbd{C-u C-c C-z}) @item C-c C-s @tab @code{geiser-set-scheme} @tab Specify Scheme implementation for buffer @item @tab @tab @item M-. @tab @code{geiser-edit-symbol-at-point} @tab Go to definition of identifier at point @item M-, @tab @code{geiser-pop-symbol-stack} @tab Go back to where M-. was last invoked @item C-c C-e C-m @tab @code{geiser-edit-module} @tab Ask for a module and open its file @item C-c C-e C-l @tab @code{geiser-add-to-load-path} @tab Ask for a directory and add to Scheme load path @item C-c C-e C-[ @tab @code{geiser-squarify} @tab Toggle between () and [] for current form @item C-c C-\ @tab @code{geiser-insert-lambda} @tab Insert greek lambda or, with prefix, a lambda form @item @tab @tab @item C-M-x @tab @code{geiser-eval-definition} @tab Eval definition around point @item C-c M-e @tab @code{geiser-eval-definition-and-go} @tab Eval definition around point and switch to REPL @item C-x C-e @tab @code{geiser-eval-last-sexp} @tab Eval sexp before point @item C-c C-r @tab @code{geiser-eval-region} @tab Eval region @item C-c M-r @tab @code{geiser-eval-region-and-go} @tab Eval region and switch to REPL @item C-c C-b @tab @code{geiser-eval-buffer} @tab Eval buffer @item C-c M-b @tab @code{geiser-eval-buffer-and-go} @tab Eval buffer and switch to REPL @item @tab @tab @item C-c C-m C-x @tab @code{geiser-expand-definition} @tab Macro-expand definition around point @item C-c C-m C-e @tab @code{geiser-expand-last-sexp} @tab Macro-expand sexp before point @item C-c C-m C-r @tab @code{geiser-expand-region} @tab Macro-expand region @item @tab @tab @item C-c C-k @tab @code{geiser-compile-current-buffer} @tab Compile and load current file @item M-g n, C-x ` @tab @code{next-error} @tab Jump to the location of next error @item M-g p @tab @code{previous-error} @tab Jump to the location of previous error @item @tab @tab @item C-c C-d C-d @tab @code{geiser-doc-symbol-at-point} @tab See documentation for identifier at point @item C-c C-d C-s @tab @code{geiser-autodoc-show} @tab Show signature or value for identifier at point in echo area @item C-c C-d C-m @tab @code{geiser-doc-module} @tab See a list of a module's exported identifiers @item C-c C-d C-i @tab @code{geiser-doc-look-up-manual} @tab Look up manual for symbol at point @item C-c C-d C-a @tab @code{geiser-autodoc-mode} @tab Toggle autodoc mode @item @tab @tab @item C-c < @tab @code{geiser-xref-callers} @tab Show callers of procedure at point @item C-c > @tab @code{geiser-xref-callees} @tab Show callees of procedure at point @item @tab @tab @item M-TAB @tab @code{completion-at-point} @tab Complete identifier at point @item M-`, C-. @tab @code{geiser-completion--complete-module} @tab Complete module name at point @end multitable @node REPL, Documentation browser, Scheme buffers, Cheat sheet @section REPL @multitable @columnfractions .20 .4 .4 @headitem Key @tab Command @tab Description @item C-c C-z @tab @code{switch-to-geiser} @tab Start Scheme REPL, or jump to previous buffer @item C-c M-o @tab @code{geiser-repl-clear-buffer} @tab Clear REPL buffer @item C-c C-k @tab @code{geiser-repl-interrupt} @tab Interrupt REPL evaluation (signalling inferior scheme) @item C-c C-q @tab @code{geiser-repl-exit} @tab Kill Scheme process @item M-. @tab @code{geiser-edit-symbol-at-point} @tab Edit identifier at point @item TAB @tab @code{geiser-repl-tab-dwim} @tab Complete, indent, or go to next error @item S-TAB (backtab) @tab @code{geiser-repl--previous-error} @tab Go to previous error in the REPL buffer @item M-TAB @tab @code{completion-at-point} @tab Complete indentifier at point @item M-`, C-. @tab @code{geiser-completion--complete-module} @tab Complete module name at point @item C-c C-r @tab @code{geiser-add-to-load-path} @tab Ask for a directory and add to Scheme load path @item M-p, M-n @tab (comint commands) @tab Prompt history, matching current prefix @item C-c M-p, C-c M-n @tab (comint commands) @tab Previous/next prompt inputs @item C-c C-m @tab @code{switch-to-geiser-module} @tab Set current module @item C-c C-i @tab @code{geiser-repl-import-module} @tab Import module into current namespace @item C-c C-d C-d @tab @code{geiser-doc-symbol-at-point} @tab See documentation for symbol at point @item C-c C-d C-i @tab @code{geiser-doc-look-up-manual} @tab Look up manual for symbol at point @item C-c C-d C-m @tab @code{geiser-repl--doc-module} @tab See documentation for module @item C-c C-d C-a @tab @code{geiser-autodoc-mode} @tab Toggle autodoc mode @end multitable @node Documentation browser, , REPL, Cheat sheet @section Documentation browser @multitable @columnfractions .20 .4 .4 @headitem Key @tab Command @tab Description @item TAB, n @tab @code{forward-button} @tab Next link @item S-TAB, p @tab @code{backward-button} @tab Previous link @item N @tab @code{geiser-doc-next-section} @tab Next section @item P @tab @code{geiser-doc-previous-section} @tab Previous section @item f @tab @code{geiser-doc-next} @tab Next page @item b @tab @code{geiser-doc-previous} @tab Previous page @item k @tab @code{geiser-doc-kill-page} @tab Kill current page and go to previous or next @item g, r @tab @code{geiser-doc-refresh} @tab Refresh page @item c @tab @code{geiser-doc-clean-history} @tab Clear browsing history @item ., M-. @tab @code{geiser-doc-edit-symbol-at-point} @tab Edit identifier at point @item z @tab @code{geiser-doc-switch-to-repl} @tab Switch to REPL @item q @tab @code{View-quit} @tab Bury buffer @end multitable @ifhtml @html
@end html @end ifhtml geiser-0.8.1/doc/repl.texi0000644000175000017500000005115012466037620012331 00000000000000@node The REPL @chapter The REPL @anchor{quick-start} If you've followed the instructions in @ref{Installation}, your Emacs is now ready to start playing. Otherwise, i'll wait for you: when you're ready, just come back here and proceed to the following sections. @menu * Starting the REPL:: * First aids:: * Switching context:: * Completion and error handling:: * Autodoc and friends:: * Seeing is believing:: * Customization and tips:: @end menu @node Starting the REPL, First aids, The REPL, The REPL @section Starting the REPL @cindex REPL To start a Scheme REPL (meaning, a Scheme process offering you a Read-Eval-Print Loop), Geiser provides the generic interactive command @command{run-geiser}. If you invoke it (via, as is customary in Emacs, @kbd{M-x run-geiser}), you'll be saluted by a prompt asking which one of the supported implementations you want to launch---yes, you can stop the asking, see @altr{active-implementations,below,Customization and tips,.} Tabbing for completion will offer you, as of this writing, @code{guile} and @code{racket}. Just choose your poison, and a new REPL buffer will pop up (by default, the REPL will appear in a new window: if that annoys you, just set @code{geiser-repl-use-other-window} to @code{nil} and the current window will be used). @imgc{repls} If all went according to plan, you'll be facing an implementation-dependent banner, followed by an interactive prompt. Going according to plan includes having the executable of the Scheme you chose in your path. If that's not the case, you can tell Emacs where it is, as described in @altr{impl-binary,a moment,Customization and tips,.} Returning to our REPL, the first thing to notice is that the funny prompt is telling you your current module: its name is the part just after the @@ sign (in Guile, that means @code{guile-user}, while Racket's and Chicken's top namespaces don't have a name; cf. discussion in @altr{Switching context,,Switching context,).} Other than that, this is pretty much equivalent to having a command-line interpreter in a terminal, with a bunch of add-ons that we'll be reviewing below. You can start typing sexps right there: Geiser will only dispatch them for evaluation when they're complete, and will indent new lines properly until then. It will also keep track of your input, maintaining a history file that will be reloaded whenever you restart the REPL. @cindex REPL, faces @cindex faces, in the REPL If you're not happy with the faces Geiser is using for the REPL's prompt and evaluated input, you can customise @code{geiser-font-lock-repl-prompt} and @code{geiser-font-lock-repl-input} to better looking faces. @subsubheading Connecting to an external Scheme @cindex remote REPL @cindex connect to server There's an alternative way of starting a Geiser REPL: you can connect to an external Scheme process, provided it's running a REPL server at some known port. How to make that happen depends on the Scheme implementation. @cindex Guile's REPL server If you use Guile, you just need to start your Guile process (possibly outside Emacs) passing to it the flag @code{--listen}. This flag accepts an optional port as argument (as in @code{--listen=1969}), if you don't want to use the default. @cindex Racket's REPL server In Racket, you have to use the REPL server that comes with Geiser. To that end, put Geiser's Racket @file{scheme} directory in Racket's collection search path and invoke @code{start-geiser} (a procedure in the module @code{geiser/server}) somewhere in your program, passing it the desired port and, if desired, network interface name. This procedure will start the REPL server in a separate thread. For an example of how to do that, see the script @file{bin/geiser-racket.sh} in the source distribution, or, if you've compiled Geiser, @file{bin/geiser-racket-noinst} in the build directory, or, if you've installed Geiser, @file{geiser-racket} in @file{/bin}. These scripts start a new interactive Racket that is also running a REPL server (they also load the errortrace library to provide better diagnostics, but that's not strictly needed). With your external Scheme process running and serving, come back to Emacs and execute @kbd{M-x geiser-connect}, @kbd{M-x connect-to-guile} or @kbd{M-x connect-to-racket}. You'll be asked for a host and a port, and, voila, you'll have a Geiser REPL that is served by the remote Scheme process in a dedicated thread, meaning that your external program can go on doing whatever it was doing while you tinker with it from Emacs. Note, however, that all Scheme threads share the heap, so that you'll be able to interact with those other threads in the running Scheme from Emacs in a variety of ways. For starters, all your (re)definitions will be visible everywhere. That's dangerous, but will come in handy when you need to debug your running web server. @cindex remote connections The connection between Emacs and the Scheme process goes over TCP, so it can be as remote as you need, perhaps with the intervention of an SSH tunnel. @node First aids, Switching context, Starting the REPL, The REPL @section First aids @img{repl-menu, right} @cindex REPL commands A quick way of seeing what else Geiser's REPL can do for you, is to display the corresponding entry up there in your menu bar. No, i don't normally use menus either; but they can come in handy until you've memorized Geiser's commands, as a learning device. And yes, i usually run Emacs inside a terminal, but one can always use @uref{http://www.emacswiki.org/emacs/LaCarte, La Carte} to access the menus in a convenient enough fashion. Or just press @kbd{C-h m} and be done with that. Among the commands at your disposal, we find the familiar input navigation keys, with a couple twists. By default, @kbd{M-p} and @kbd{M-n} are bound to @i{matching} items in your input history. That is, they'll find the previous or next sexp that starts with the current input prefix (defined as the text between the end of the prompt and your current position, a.k.a. @dfn{point}, in the buffer). For going up and down the list unconditionally, just use @kbd{C-c M-p} and @kbd{C-c M-n}. In addition, navigation is sexp-based rather than line-based. There are also a few commands to twiddle with the Scheme process. @kbd{C-c C-q} will gently ask it to quit, while @kbd{C-u C-c C-q} will mercilessly kill the process (but not before stowing your history in the file system). Unless you're using a remote REPL, that is, in which case both commands will just sever the connection and leave the remote process alone. If worse comes to worst and the process is dead, @kbd{C-c C-z} will restart it. However, the same shortcut, issued when the REPL is alive, will bring you back to the buffer you came from, as explained in @altr{switching-repl-buff,this section,The source and the REPL,.} The remaining commands are meatier, and deserve sections of their own. @node Switching context, Completion and error handling, First aids, The REPL @section Switching context @cindex current module, in REPL @cindex ,enter vs. enter! In tune with Geiser's @ifhtml @ref{current-module,,modus operandi}, @end ifhtml @ifnothtml @i{modus operandi}, @end ifnothtml evaluations in the REPL take place in the namespace of the current module. As noted above, the REPL's prompt tells you the name of the current module. To switch to a different one, you can use the command @command{switch-to-geiser-module}, bound to @kbd{C-c C-m}. You'll notice that Geiser simply uses a couple of meta-commands provided by the Scheme REPL (the stock @command{,m} in Guile and Chicken and the (geiser-defined) @command{,enter} in Racket), and that it doesn't even try to hide that fact. That means that you can freely use said native ways directly at the REPL, and Geiser will be happy to oblige. In Racket, @command{,enter} works like Racket's standard @code{enter!} form, but you can also provide a path string as its argument (e.g., @command{,enter "/tmp/foo.rkt"} is equivalent to @command{,enter (file "/tmp/foo.rkt")}). Like @code{enter!}, @command{,enter} accepts also module names (as in, say, @command{,enter geiser/main}). As mentioned, in Guile and Chicken, @command{,m} is used @i{as is}. @cindex current module, change Once you enter a new module, only those bindings visible in its namespace will be available to your evaluations. All Schemes supported by Geiser provide a way to import new modules in the current namespace. Again, there's a Geiser command, @command{geiser-repl-import-module}, to invoke such functionality, bound this time to @kbd{C-c C-i}. And, again, you'll see Geiser just introducing the native incantation for you, and you're free to use such incantations by hand whenever you want. One convenience provided by these two Geiser commands is that completion is available when introducing the new module name, using the @kbd{@key{TAB}} key. Pressing it at the command's prompt will offer you a prefix-aware list of available module names. @imgc{mod-completion} Which brings me to the next group of REPL commands. @node Completion and error handling, Autodoc and friends, Switching context, The REPL @section Completion and error handling @cindex completion, at the REPL We've already seen Geiser completion of module names in action at the minibuffer. You won't be surprised to know that it's also available at the REPL buffer itself. There, you can use either @kbd{C-.} or @kbd{M-`} to complete module names, and @kbd{@key{TAB}} or @kbd{M-@key{TAB}} to complete identifiers. Geiser will know what identifiers are bound in the current module and show you a list of those starting with the prefix at point. Needless to say, this is not a static list, and it will grow as you define or import new bindings in the namespace at hand. If no completion is found, @kbd{@key{TAB}} will try to complete the prefix after point as a module name. REPL buffers use Emacs' compilation mode to highlight errors reported by the Scheme interpreter, and you can use the @command{next-error} command (@kbd{M-g n}) to jump to their location. By default, every time you enter a new expression for evaluation old error messages are forgotten, so that @kbd{M-g n} will always jump to errors related to the last evaluation request, if any. If you prefer a not-so-forgetful REPL, set the customization variable @code{geiser-repl-forget-old-errors-p} to @code{nil}. Note, however, that even when that variable is left as @kbd{t}, you can always jump to an old error by moving to its line at the REPL and pressing @kbd{@key{RET}}. When your cursor is away from the last prompt, @kbd{@key{TAB}} will move to the next error in the buffer, and you can use @kbd{@key{BACKTAB}} everywhere to go to the previous one. @node Autodoc and friends, Seeing is believing, Completion and error handling, The REPL @section Autodoc and friends Oftentimes, there's more you'll want to know about an identifier besides its name: What module does it belong to? Is it a procedure and, if so, what arguments does it take? Geiser tries to help you answering those questions too. @cindex autodoc, in the REPL Actually, if you've been playing with the REPL as you read, you might have notice some frantic activity taking place in the echo area every now and then. That was Geiser trying to be helpful (while, hopefully, not being clippy), or, more concretely, what i call, for want of a better name, its @dfn{autodoc} mode. Whenever it's active (did you notice that @i{A} in the mode-line?), Geiser's gerbils will be scanning what you type and showing (unless you silence them with @kbd{C-c C-d C-a}) information about the identifier nearest to point. @imgc{repl-autodoc} If that identifier corresponds to a variable visible in the current namespace, you'll see the module it belongs to and its value. For procedures and macros, autodoc will display, instead of their value, the argument names (or an underscore if Geiser cannot determine the name used in the definition). Optional arguments are surrounded by parentheses. When the optional argument has a default value, it's represented by a list made up of its name and that value. When the argument is a keyword argument, its name has ``#:'' as a prefix. @cindex help on identifier If that's not enough documentation for you, @kbd{C-c C-d d} will open a separate documentation buffer with help on the symbol at point. This buffer will contain implementation-specific information about the identifier (e.g., its docstring for Guile, or its contract, if any, for Racket), and a handy button to open the corresponding manual entry for the symbol, which will open an HTML page (for Racket and Chicken) or the texinfo manual (for Guile). If you'd rather go directly to the manual, try @kbd{C-c C-d i}, which invokes @code{geiser-doc-look-up-manual} as the handy button does. @cindex module exports @anchor{repl-mod} Geiser can also produce for you a list, classified by kind, of the identifiers exported by a given module: all you need to do is press @kbd{C-c C-d m}, and type or complete the desired module's name. @imgc{repl-mod} The list of exported bindings is shown, again, in a buffer belonging to Geiser's documentation browser, where you have at your disposal a bunch of navigation commands listed in @altr{Documentation browser,our cheat-sheet,Documentation browser,.} We'll have a bit more to say about the documentation browser in @altr{doc-browser,a later section,Documentation helpers,.} @cindex jump, at the REPL If that's still not enough, Geiser can jump, via @kbd{M-.}, to the symbol's definition. A buffer with the corresponding file will pop up, with its point resting upon the identifier's defining form. When you're done inspecting, @kbd{M-,} will bring you back to where you were. As we will see, these commands are also available in Scheme buffers. @kbd{M-.} also works for modules: if your point is on an unambiguous module name, the file where it's defined will be opened for you. @node Seeing is believing, Customization and tips, Autodoc and friends, The REPL @section Seeing is believing @cindex image support In schemes that support images as values (currently, that means Racket), the REPL will display them inline if you're using them in a graphics-aware Emacs. @imgc{repl-images} @cindex external image viewer @cindex image viewer For the terminal, images will appear as buttons: press return on them to invoke an external viewer (configurable via @code{geiser-image-viewer}) that will show you the image at hand. You can also ask for the same behaviour on all emacsen by customising @code{geiser-repl-inline-images-p} to @code{nil}. @cindex image cache Geiser keeps a cache of the last displayed images in the directory @code{geiser-image-cache-dir}, which defaults to the system's temp directory, with up to @code{geiser-image-cache-keep-last} files. You can invoke the external image viewer on any of them with @command{M-x geiser-view-last-image}, which takes a prefix argument to indicate which image number you want, 0 corresponding to the newest one. @node Customization and tips, , Seeing is believing, The REPL @section Customization and tips @cindex REPL customization The looks and ways of the REPL can be fine-tuned via a bunch of customization variables. You can see and modify them all in the corresponding customization group (by using the menu entry or the good old @kbd{M-x customize-group geiser-repl}), or by setting them in your Emacs initialisation files (as a rule, all knobs in Geiser are tunable this way: you don't need to use customization buffers if you don't like them). I'm documenting below a proper subset of those settings, together with some related tips. @subsubheading Choosing a Scheme implementation @cindex scheme implementation, choosing @anchor{choosing-impl} Instead of using the generic @command{run-geiser} command, you can start directly your Scheme of choice via @command{run-racket} or @command{run-guile}. @anchor{active-implementations} In addition, the variable @code{geiser-active-implementations} contains a list of those Schemes Geiser should be aware of. Thus, if you happen to be, say, a racketeer not to be beguiled by other schemes, you can tell Geiser to forget about the richness of the Scheme ecosystem with something like: @example (setq geiser-active-implementations '(racket)) @end example @noindent in your initialisation files. @cindex scheme binary @cindex scheme executable path @anchor{impl-binary} When starting a new REPL, Geiser assumes, by default, that the corresponding Scheme binary is in your path. If that's not the case, the variables to tweak are @code{geiser-guile-binary} and @code{geiser-racket-binary}, which should be set to a string with the full path to the requisite binary. @cindex Version checking Before starting the REPL, Geiser will check wether the version of your Scheme interpreter is good enough. This means that it will spend a couple tenths of a second launching and quickly discarding a Scheme process, but also that the error message you'll get if you're on the wrong Scheme version will be much more informative. If you one to avoid version checks, just check @code{geiser-repl-skip-version-check-p} to @code{t} in your configuration. @cindex scheme load path @cindex scheme init file @cindex GUILE_LOAD_PATH @cindex GUILE_LOAD_COMPILED_PATH @cindex PLTCOLLECTS You can also specify a couple more initialisation parameters. For Guile, @code{geiser-guile-load-path} is a list of paths to add to its load path (and its compiled load path) when it's started, while @code{geiser-guile-init-file} is the path to an initialisation file to be loaded on start-up. The equivalent variables for Racket are @code{geiser-racket-collects} and @code{geiser-racket-init-file}. Note, however, that specifying @code{geiser-guile-init-file} is @i{not} equivalent to changing Guile's initialization file (@file{~/.guile}), because the former is loaded using the @code{-l} flag, together with @code{-q} to disable loading the second. But there are subtle differences in the way Guile loads the initialization file versus how it loads a file specified via the @code{-l} flag. If what you want is just loading @file{~/.guile}, leave @code{geiser-guile-init-file} alone and set @code{geiser-guile-load-init-file-p} to @code{t} instead. @subsubheading Racket startup time @cindex startup timeout @cindex timeout When starting Racket in little computers, Geiser might have to wait a bit more than it expects (which is ten seconds, or ten thousand milliseconds, by default). If you find that Geiser is giving up too quickly and complaining that no prompt was found, try to increase the value of @code{geiser-repl-startup-time} to, say, twenty seconds: @example (setq geiser-repl-startup-time 20000) @end example @noindent If you prefer, you can use the customize interface to, well, customise the above variable's value. @subsubheading History By default, Geiser won't record duplicates in your input history. If you prefer it did, just set @code{geiser-repl-history-no-dups-p} to @code{nil}. History entries are persistent across REPL sessions: they're saved in implementation-specific files whose location is controlled by the variable @code{geiser-repl-history-filename}. For example, my Geiser configuration includes the following line: @example (setq geiser-repl-history-filename "~/.emacs.d/geiser-history") @end example @noindent which makes the files @file{geiser-history.guile} and @file{geiser-history.racket} to live inside my home's @file{.emacs.d} directory. @subsubheading Autodoc @cindex autodoc, disabling @cindex peace and quiet If you happen to love peace and quiet and prefer to keep your REPL's echo area free from autodoc's noise, @code{geiser-repl-autodoc-p} is the customization variable for you: set it to @code{nil} and autodoc will be disabled by default in new REPLs. You can always bring the fairies back, on a per-REPL basis, using @kbd{C-c C-d C-a}. @subsubheading Remote connections @cindex port, default @cindex host, default When using @code{connect-to-guile}, @code{connect-to-racket} or @code{geiser-connect}, you'll be prompted for a host and a port, defaulting to ``localhost'' and 37146. You can change those defaults customizing @code{geiser-repl-default-host} and @code{geiser-repl-default-port}, respectively. @subsubheading Killing REPLs @cindex ask on kill, don't If you don't want Emacs to ask for confirmation when you're about to kill a live REPL buffer (as will happen, for instance, if you're exiting Emacs before closing all your REPLs), you can set the flag @code{geiser-repl-query-on-kill-p} to @code{nil}. On a related note, the customizable variable @code{geiser-repl-query-on-exit-p} controls whether Geiser should ask for confirmation when you exit the REPL explicitly (via, say, @kbd{C-c C-q}, as opposed to killing the buffer), and is set to @code{nil} by default. @c Local Variables: @c mode: texinfo @c TeX-master: "geiser" @c End: geiser-0.8.1/INSTALL0000644000175000017500000000415012466037502010755 00000000000000Installing Geiser. ------------------ Geiser is usable from its source tree, with no configuration whatsoever, or can be installed from ELPA with `M-x install-package' is Marmalade is in your list of archives. You can also (byte) compile and install it with the usual configure/make/make install dance. * From ELPA Add Marmalade to your `package-archives' list: (require 'package) (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/")) (package-initialize) and run `M-x install-package RET geiser`. You can also use http://download.savannah.gnu.org/releases/geiser/packages as a repo, or download directly the package from there and use M-x package-install-file. * In place - Extract the tarball or clone the git repository anywhere in your file system. Let's call that place . - In your .emacs: (load-file "/elisp/geiser.el") * Byte-compiled - Create a build directory, `build', say: $ cd $ mkdir build; cd build - Configure and make: $ ../configure && make Now, you can use the byte-compiled Geiser in place by adding to your .emacs: (load "/build/elisp/geiser-load") or, alternatively, install it with: $ make install (you might need to get root access, depending on your installation directory) and, instead of the above load forms, require 'geiser-install (not 'geiser, mind you) in your emacs initialization file: (require 'geiser-install) * Chicken Addendum These steps are necessary to fully support Chicken Scheme, but are not required for any other scheme. - Install the necessary support eggs: $ chicken-install -s apropos chicken-doc - Update the Chicken documentation database: $ cd `csi -p '(chicken-home)'` $ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx You're ready to go! Geiser's makefile accepts also all those other standard autotools targets that you've come to know and love and that are documented in virtually all boilerplate INSTALL files out there. geiser-0.8.1/AUTHORS0000644000175000017500000000066512606675221011005 00000000000000Jose A. Ortega Ruiz designed and implemented Geiser and is its active maintainer. For more boring details about him, see . Daniel J. Leslie implemented and maintains Geiser's support for Chicken. Contributors: Michael Wilber Diogo F. S. Ramos Jonas Rodrigues Ray Racine Nick Parker Darren Hoo Ludovic Courtès Alex Kost Mario Rodas Christoph Egger See also . geiser-0.8.1/THANKS0000644000175000017500000000360612606675410010646 00000000000000Dan Leslie, with the help of his three-months old daughter Freija, proved there's a smidgen of sense in this madness by adding support for Chicken to version 0.7 of Geiser, several years after it was born. Andy Wingo, Geiser's first user, has been a continuous source of encouragement and suggestions, and keeps improving Guile and heeding my feature requests. The nice thing about collaborating with Andreas Rottmann over all these years is that he will not only make your project better with insightful comments and prodding: he'll send you patches galore too. Ludovic Courtès, #geiser's citizen no. 1, joined the fun after a while, and has since then been a continuous source of encouragement, ideas and bug reports. Michael Wilber convinced me that image support for Racket was not only fun, but easy, with the best argument: actual code! Daniel Hackney and Grant Rettke created the first ELPA packages for Geiser and taught me to fish. Diogo F. S. Ramos is Geiser's most indefatigable user and bug reporter, and the mailing list has been a far less lonely place since he came. Aleix Conchillo has been my favourite spammer, beta tester and patch sender during more years and for more projects than i can remember. Eduardo Cavazos' contagious enthusiasm has helped in many ways to keep Geiser alive, and he's become its best evangelist in R6RS circles. Alex Kost has contributed with many bug reports and improved Geiser with several patches. Eli Barzilay took the time to play with an early alpha and made many valuable suggestions, besides answering all my 'how do you in PLT' questions. Matthew Flatt, Robby Findler and the rest of the PLT team did not only answer my inquiries, but provided almost instant fixes to the few issues i found. Thanks also to the PLT and Guile communities, for showing me that Geiser was not only possible, but a pleasure to hack on. And to the Slime hackers, who led the way. geiser-0.8.1/install-sh0000755000175000017500000003253711623601337011737 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geiser-0.8.1/configure0000755000175000017500000033102112607252022011624 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Geiser 0.8.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: geiser-users@nongnu.org about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Geiser' PACKAGE_TARNAME='geiser' PACKAGE_VERSION='0.8.1' PACKAGE_STRING='Geiser 0.8.1' PACKAGE_BUGREPORT='geiser-users@nongnu.org' PACKAGE_URL='' ac_unique_file="elisp/geiser.el" ac_subst_vars='LTLIBOBJS LIBOBJS lispdir EMACSLOADPATH EMACS AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules with_lispdir ' ac_precious_vars='build_alias host_alias target_alias EMACS EMACSLOADPATH' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Geiser 0.8.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/geiser] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Geiser 0.8.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-lispdir override the default lisp directory Some influential environment variables: EMACS the Emacs editor command EMACSLOADPATH the Emacs library search path Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Geiser configure 0.8.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Geiser $as_me 0.8.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='geiser' VERSION='0.8.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "makeinfo", so it can be a program name with args. set dummy makeinfo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MAKEINFO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MAKEINFO"; then ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MAKEINFO="makeinfo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="no" fi fi MAKEINFO=$ac_cv_prog_MAKEINFO if test -n "$MAKEINFO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 $as_echo "$MAKEINFO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= for ac_prog in emacs xemacs do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_EMACS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$EMACS"; then ac_cv_prog_EMACS="$EMACS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_EMACS="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi EMACS=$ac_cv_prog_EMACS if test -n "$EMACS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS" >&5 $as_echo "$EMACS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$EMACS" && break done test -n "$EMACS" || EMACS="no" # Check whether --with-lispdir was given. if test "${with_lispdir+set}" = set; then : withval=$with_lispdir; lispdir="$withval" { $as_echo "$as_me:${as_lineno-$LINENO}: checking where .elc files should go" >&5 $as_echo_n "checking where .elc files should go... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lispdir" >&5 $as_echo "$lispdir" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking where .elc files should go" >&5 $as_echo_n "checking where .elc files should go... " >&6; } if ${am_cv_lispdir+:} false; then : $as_echo_n "(cached) " >&6 else if test $EMACS != "no"; then if test x${lispdir+set} != xset; then # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly # Some emacsen will start up in interactive mode, requiring C-x C-c to exit, # which is non-obvious for non-emacs users. # Redirecting /dev/null should help a bit; pity we can't detect "broken" # emacsen earlier and avoid running this altogether. { { $as_echo "$as_me:${as_lineno-$LINENO}: \$EMACS -batch -Q -eval '(while load-path (princ (concat (car load-path) \"\\n\")) (setq load-path (cdr load-path)))' conftest.out"; } >&5 ($EMACS -batch -Q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' conftest.out) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } am_cv_lispdir=`sed -n \ -e 's,/$,,' \ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \ conftest.out` rm conftest.out fi fi test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_lispdir" >&5 $as_echo "$am_cv_lispdir" >&6; } lispdir="$am_cv_lispdir" fi ac_config_files="$ac_config_files Makefile elisp/Makefile elisp/geiser-version.el elisp/geiser-load.el scheme/Makefile bin/Makefile doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Geiser $as_me 0.8.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Geiser config.status 0.8.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "elisp/Makefile") CONFIG_FILES="$CONFIG_FILES elisp/Makefile" ;; "elisp/geiser-version.el") CONFIG_FILES="$CONFIG_FILES elisp/geiser-version.el" ;; "elisp/geiser-load.el") CONFIG_FILES="$CONFIG_FILES elisp/geiser-load.el" ;; "scheme/Makefile") CONFIG_FILES="$CONFIG_FILES scheme/Makefile" ;; "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi geiser-0.8.1/scheme/0000755000175000017500000000000012607252047011250 500000000000000geiser-0.8.1/scheme/guile/0000755000175000017500000000000012607252046012354 500000000000000geiser-0.8.1/scheme/guile/geiser/0000755000175000017500000000000012607252047013633 500000000000000geiser-0.8.1/scheme/guile/geiser/modules.scm0000644000175000017500000000514011625052311015716 00000000000000;;; modules.scm -- module metadata ;; Copyright (C) 2009, 2010, 2011 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Mar 02, 2009 02:00 (define-module (geiser modules) #:export (symbol-module module-name? module-path find-module all-modules submodules module-location) #:use-module (geiser utils) #:use-module (system vm program) #:use-module (ice-9 regex) #:use-module (ice-9 session) #:use-module (srfi srfi-1)) (define (module-name? module-name) (and (list? module-name) (not (null? module-name)) (every symbol? module-name))) (define (symbol-module sym . all) (and sym (catch 'module-name (lambda () (apropos-fold (lambda (module name var init) (if (eq? name sym) (throw 'module-name (module-name module)) init)) #f (regexp-quote (symbol->string sym)) (if (or (null? all) (not (car all))) (apropos-fold-accessible (current-module)) apropos-fold-all))) (lambda (key . args) (and (eq? key 'module-name) (car args)))))) (define (module-location name) (make-location (module-path name) #f)) (define (find-module mod-name) (and (module-name? mod-name) (resolve-module mod-name #f #:ensure #f))) (define (module-path module-name) (and (module-name? module-name) (or ((@@ (ice-9 session) module-filename) module-name) (module-filename (resolve-module module-name #f))))) (define (submodules mod) (hash-map->list (lambda (k v) v) (module-submodules mod))) (define (root-modules) (submodules (resolve-module '() #f))) (define (all-modules) (define (maybe-name m) (and (module-kind m) (format #f "~A" (module-name m)))) (let* ((guile (resolve-module '(guile))) (roots (remove (lambda (m) (eq? m guile)) (root-modules))) (children (append-map all-child-modules roots))) (cons "(guile)" (filter-map maybe-name children)))) (define* (all-child-modules mod #:optional (seen '())) (let ((cs (filter (lambda (m) (not (member m seen))) (submodules mod)))) (fold (lambda (m all) (append (all-child-modules m all) all)) (list mod) cs))) geiser-0.8.1/scheme/guile/geiser/emacs.scm0000644000175000017500000000405511623601337015350 00000000000000;;; emacs.scm -- procedures for emacs interaction: entry point ;; Copyright (C) 2009, 2010, 2011 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Feb 08, 2009 18:39 (define-module (geiser emacs) #:use-module (ice-9 match) #:use-module (system repl command) #:use-module (system repl error-handling) #:use-module (system repl server) #:use-module (geiser evaluation) #:use-module ((geiser modules) #:renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser completion) #:renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser xref) #:renamer (symbol-prefix-proc 'ge:)) #:use-module ((geiser doc) #:renamer (symbol-prefix-proc 'ge:))) (define this-module (resolve-module '(geiser emacs))) (define-meta-command ((geiser-no-values geiser) repl) "geiser-no-values No-op command used internally by Geiser." (values)) (define-meta-command ((geiser-newline geiser) repl) "geiser-newline Meta-command used by Geiser to emit a new line." (newline)) (define-meta-command ((geiser-eval geiser) repl (mod form args) . rest) "geiser-eval module form args () Meta-command used by Geiser to evaluate and compile code." (if (null? args) (call-with-error-handling (lambda () (ge:compile form mod))) (let ((proc (eval form this-module))) (ge:eval `(,proc ,@args) mod)))) (define-meta-command ((geiser-load-file geiser) repl file) "geiser-load-file file Meta-command used by Geiser to load and compile files." (call-with-error-handling (lambda () (ge:compile-file file)))) (define-meta-command ((geiser-start-server geiser) repl) "geiser-start-server Meta-command used by Geiser to start a REPL server." (let* ((sock (make-tcp-server-socket #:port 0)) (port (sockaddr:port (getsockname sock)))) (spawn-server sock) (write (list 'port port)) (newline))) geiser-0.8.1/scheme/guile/geiser/utils.scm0000644000175000017500000000307111625052304015411 00000000000000;;; utils.scm -- utility functions ;; Copyright (C) 2009, 2010, 2011 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Mar 02, 2009 01:48 (define-module (geiser utils) #:export (make-location symbol->object pair->list sort-symbols! make-symbol-sort gensym?) #:use-module (ice-9 regex)) (define (symbol->object sym) (and (symbol? sym) (module-defined? (current-module) sym) (module-ref (current-module) sym))) (define (pair->list pair) (let loop ((d pair) (s '())) (cond ((null? d) (reverse! s)) ((symbol? d) (reverse! (cons d s))) (else (loop (cdr d) (cons (car d) s)))))) (define (make-location file line) (list (cons "file" (if (string? file) file '())) (cons "line" (if (number? line) (+ 1 line) '())))) (define (sort-symbols! syms) (let ((cmp (lambda (l r) (stringstring l) (symbol->string r))))) (sort! syms cmp))) (define (make-symbol-sort sel) (let ((cmp (lambda (a b) (stringstring (sel a)) (symbol->string (sel b)))))) (lambda (syms) (sort! syms cmp)))) (define (gensym? sym) (and (symbol? sym) (gensym-name? (format #f "~A" sym)))) (define (gensym-name? name) (and (string-match "^#[{]" name) #t)) geiser-0.8.1/scheme/guile/geiser/xref.scm0000644000175000017500000000555611623601337015233 00000000000000;;; xref.scm -- cross-referencing utilities ;; Copyright (C) 2009, 2010 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Mar 02, 2009 02:37 (define-module (geiser xref) #:export (symbol-location generic-methods callers callees find-file) #:use-module (geiser utils) #:use-module (geiser modules) #:use-module (geiser doc) #:use-module (oop goops) #:use-module (system xref) #:use-module (system vm program)) (define (symbol-location sym) (cond ((symbol-module sym) => module-location) (else (let ((obj (symbol->object sym))) (or (and (program? obj) (program-location obj)) '()))))) (define (generic-methods sym) (let* ((gen (symbol->object sym)) (methods (if (is-a? gen ) (generic-function-methods gen) '()))) (filter (lambda (x) (not (null? x))) (map (lambda (m) (make-xref (method-procedure m) sym (symbol-module sym))) methods)))) (define (make-xref proc name module) (and proc `(("location" . ,(or (program-location proc) (symbol-location name))) ("signature" . ,(object-signature name proc)) ("module" . ,(or module '()))))) (define (program-location p) (cond ((not (program? p)) #f) ((program-source p 0) => (lambda (s) (make-location (program-path p) (source:line s)))) ((program-path p) => (lambda (s) (make-location s #f))) (else #f))) (define (program-path p) (let* ((mod (program-module p)) (name (and (module? mod) (module-name mod)))) (and name (module-path name)))) (define (procedure-xref proc . mod-name) (let* ((proc-name (or (procedure-name proc) ')) (mod-name (if (null? mod-name) (symbol-module proc-name) (car mod-name)))) (make-xref proc proc-name mod-name))) (define (callers sym) (let ((mod (symbol-module sym #t))) (and mod (apply append (map (lambda (procs) (map (lambda (proc) (procedure-xref proc (car procs))) (cdr procs))) (procedure-callers (cons mod sym))))))) (define (callees sym) (let ((obj (symbol->object sym))) (and obj (map procedure-xref (procedure-callees obj))))) (define (find-file path) (let loop ((dirs %load-path)) (if (null? dirs) #f (let ((candidate (string-append (car dirs) "/" path))) (if (file-exists? candidate) candidate (loop (cdr dirs))))))) geiser-0.8.1/scheme/guile/geiser/doc.scm0000644000175000017500000002260412153361216015023 00000000000000;;; doc.scm -- procedures providing documentation on scheme objects ;; Copyright (C) 2009, 2010 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Feb 08, 2009 18:44 (define-module (geiser doc) #:export (autodoc symbol-documentation module-exports object-signature) #:use-module (geiser utils) #:use-module (geiser modules) #:use-module (system vm program) #:use-module (ice-9 session) #:use-module (ice-9 documentation) #:use-module (ice-9 regex) #:use-module (ice-9 format) #:use-module (oop goops) #:use-module (srfi srfi-1)) (define (autodoc ids) (if (not (list? ids)) '() (map (lambda (id) (or (autodoc* id) (list id))) ids))) (define* (autodoc* id) (let ((args (obj-args (symbol->object id)))) (and args `(,@(signature id args) ("module" . ,(symbol-module id)))))) (define (object-signature name obj) (let ((args (obj-args obj))) (and args (signature name args)))) (define (value-str obj) (format #f "~:@y" obj)) (define* (signature id args-list #:optional (detail #t)) (define (arglst args kind) (let ((args (assq-ref args kind))) (cond ((or (not args) (null? args)) '()) ((list? args) args) (else (list args))))) (define (mkargs as) `(("required" ,@(arglst as 'required)) ("optional" ,@(arglst as 'optional) ,@(if (assq-ref as 'rest) (list "...") '())) ("key" ,@(arglst as 'keyword)))) (let* ((args-list (map mkargs (if (list? args-list) args-list '()))) (value (and (and detail (null? args-list)) (value-str (symbol->object id))))) `(,id ("args" ,@args-list) ,@(if value `(("value" . ,value)) '())))) (define default-macro-args '(((required ...)))) (define geiser-args-key (gensym "geiser-args-key-")) (define (obj-args obj) (cond ((not obj) #f) ((or (procedure? obj) (program? obj)) (cond ((procedure-property obj geiser-args-key)) ((arguments obj) => (lambda (args) (set-procedure-property! obj geiser-args-key args) args)) (else #f))) ((and (macro? obj) (macro-transformer obj)) => macro-args) ((macro? obj) default-macro-args) (else 'variable))) (define (arguments proc) (define (p-args prog) (let ((as (map (lambda (a) ((@@ (system vm program) arity->arguments-alist) prog a)) (or (program-arities prog) '())))) (and (not (null? as)) as))) (define (clist f) (lambda (x) (let ((y (f x))) (and y (list y))))) (cond ((is-a? proc ) (generic-args proc)) ((doc->args proc) => list) ((procedure-property proc 'arglist) => (clist arglist->args)) ((procedure-source proc) => (clist source->args)) ((and (program? proc) (p-args proc))) ((procedure-property proc 'arity) => (clist arity->args)) (else #f))) (define (source->args src) (let ((formals (cadr src))) (cond ((list? formals) `((required . ,formals))) ((pair? formals) `((required . ,(car formals)) (rest . ,(cdr formals)))) (else #f)))) (define (macro-args tf) (define* (collect args #:optional (req '())) (cond ((null? args) (arglist->args `(,(reverse req) #f #f r #f))) ((symbol? args) (arglist->args `(,(reverse req) #f #f r ,args))) ((and (pair? args) (symbol? (car args))) (collect (cdr args) (cons (car args) req))) (else #f))) (let* ((pats (procedure-property tf 'patterns)) (args (and pats (filter-map collect pats)))) (or (and args (not (null? args)) args) default-macro-args))) (define (arity->args art) (define (gen-arg-names count) (map (lambda (x) '_) (iota (max count 0)))) (let ((req (car art)) (opt (cadr art)) (rest (caddr art))) `(,@(if (> req 0) (list (cons 'required (gen-arg-names req))) '()) ,@(if (> opt 0) (list (cons 'optional (gen-arg-names opt))) '()) ,@(if rest (list (cons 'rest 'rest)) '())))) (define (arglist->args arglist) `((required . ,(car arglist)) (optional . ,(cadr arglist)) (keyword . ,(caddr arglist)) (rest . ,(car (cddddr arglist))))) (define (doc->args proc) ;; Guile 2.0.9+ uses the (texinfo ...) modules to produce ;; `guile-procedures.txt', and the output has a single hyphen, whereas ;; `makeinfo' produces two hyphens. (define proc-rx "--? Scheme Procedure: ([^[\n]+)\n") (define proc-rx2 "--? Scheme Procedure: ([^[\n]+\\[[^\n]*(\n[^\n]+\\]+)?)") (let ((doc (object-documentation proc))) (and doc (let ((match (or (string-match proc-rx doc) (string-match proc-rx2 doc)))) (and match (parse-signature-string (match:substring match 1))))))) (define (parse-signature-string str) (define opt-arg-rx "\\[([^] ]+)\\]?") (define opt-arg-rx2 "([^ ])+\\]+") (let ((tokens (string-tokenize str))) (if (< (length tokens) 2) '() (let loop ((tokens (cdr tokens)) (req '()) (opt '()) (rest #f)) (cond ((null? tokens) `((required ,@(map string->symbol (reverse! req))) (optional ,@(map string->symbol (reverse! opt))) ,@(if rest (list (cons 'rest (string->symbol rest))) '()))) ((string=? "." (car tokens)) (if (not (null? (cdr tokens))) (loop (cddr tokens) req opt (cadr tokens)) (loop '() req opt "rest"))) ((or (string-match opt-arg-rx (car tokens)) (string-match opt-arg-rx2 (car tokens))) => (lambda (m) (loop (cdr tokens) req (cons (match:substring m 1) opt) rest))) (else (loop (cdr tokens) (cons (car tokens) req) opt rest))))))) (define (generic-args gen) (define (src> src1 src2) (> (length (cadr src1)) (length (cadr src2)))) (define (src m) (catch #t (lambda () (method-source m)) (lambda (k . a) #f))) (let* ((methods (generic-function-methods gen)) (srcs (filter identity (map src methods)))) (cond ((and (null? srcs) (not (null? methods)) (method-procedure (car methods))) => arguments) ((not (null? srcs)) (list (source->args (car (sort! srcs src>))))) (else '(((rest . rest))))))) (define (symbol-documentation sym) (let ((obj (symbol->object sym))) (if obj `(("signature" . ,(or (obj-signature sym obj #f) sym)) ("docstring" . ,(docstring sym obj)))))) (define (docstring sym obj) (define (valuable?) (not (or (macro? obj) (procedure? obj) (program? obj)))) (with-output-to-string (lambda () (let* ((type (cond ((macro? obj) "A macro") ((procedure? obj) "A procedure") ((program? obj) "A compiled program") (else "An object"))) (modname (symbol-module sym)) (doc (object-documentation obj))) (display type) (if modname (begin (display " in module ") (display modname) (display "."))) (newline) (if doc (begin (newline) (display doc))) (if (valuable?) (begin (newline) (display "Value:") (newline) (display " ") (display (value-str obj)))))))) (define* (obj-signature sym obj #:optional (detail #t)) (let ((args (obj-args obj))) (and args (signature sym args detail)))) (define (module-exports mod-name) (define elt-sort (make-symbol-sort car)) (let* ((mod (catch #t (lambda () (resolve-interface mod-name)) (lambda args (resolve-module mod-name)))) (elts (hash-fold classify-module-object (list '() '() '()) (module-obarray mod))) (elts (map elt-sort elts)) (subs (map (lambda (m) (list (module-name m))) (submodules (resolve-module mod-name #f))))) (list (cons "modules" subs) (cons "procs" (car elts)) (cons "syntax" (cadr elts)) (cons "vars" (caddr elts))))) (define (classify-module-object name var elts) (let ((obj (and (variable-bound? var) (variable-ref var)))) (cond ((or (not obj) (module? obj)) elts) ((or (procedure? obj) (program? obj)) (list (cons (list name `("signature" . ,(obj-signature name obj))) (car elts)) (cadr elts) (caddr elts))) ((macro? obj) (list (car elts) (cons (list name `("signature" . ,(obj-signature name obj))) (cadr elts)) (caddr elts))) (else (list (car elts) (cadr elts) (cons (list name) (caddr elts))))))) geiser-0.8.1/scheme/guile/geiser/completion.scm0000644000175000017500000000176712035426235016440 00000000000000;;; completion.scm -- completing known symbols and module names ;; Copyright (C) 2009, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Mon Mar 02, 2009 02:22 (define-module (geiser completion) #:export (completions module-completions) #:use-module (geiser utils) #:use-module (geiser modules) #:use-module (ice-9 session) #:use-module (ice-9 regex)) (define (completions prefix) (let ((prefix (string-append "^" (regexp-quote prefix)))) (sort! (map symbol->string (apropos-internal prefix)) string. ;; Start date: Mon Mar 02, 2009 02:46 (define-module (geiser evaluation) #:export (ge:compile ge:eval ge:macroexpand ge:compile-file ge:load-file ge:set-warnings ge:add-to-load-path) #:use-module (geiser modules) #:use-module (srfi srfi-1) #:use-module (language tree-il) #:use-module (system base compile) #:use-module (system base message) #:use-module (system base pmatch) #:use-module (system vm program) #:use-module (ice-9 pretty-print)) (define compile-opts '()) (define compile-file-opts '()) (define default-warnings '(arity-mismatch unbound-variable format)) (define verbose-warnings `(unused-variable ,@default-warnings)) (define (ge:set-warnings wl) (let* ((warns (cond ((list? wl) wl) ((symbol? wl) (case wl ((none nil null) '()) ((medium default) default-warnings) ((high verbose) verbose-warnings) (else '()))) (else '()))) (fwarns (if (memq 'unused-variable warns) (cons 'unused-toplevel warns) warns))) (set! compile-opts (list #:warnings warns)) (set! compile-file-opts (list #:warnings fwarns)))) (ge:set-warnings 'none) (define (call-with-result thunk) (letrec* ((result #f) (output (with-output-to-string (lambda () (with-fluids ((*current-warning-port* (current-output-port)) (*current-warning-prefix* "")) (with-error-to-port (current-output-port) (lambda () (set! result (map object->string (thunk)))))))))) (write `((result ,@result) (output . ,output))) (newline))) (define (ge:compile form module) (compile* form module compile-opts)) (define (compile* form module-name opts) (let* ((module (or (find-module module-name) (current-module))) (ev (lambda () (call-with-values (lambda () (let* ((o (compile form #:to 'objcode #:env module #:opts opts)) (thunk (make-program o))) (start-stack 'geiser-evaluation-stack (eval `(,thunk) module)))) (lambda vs vs))))) (call-with-result ev))) (define (ge:eval form module-name) (let* ((module (or (find-module module-name) (current-module))) (ev (lambda () (call-with-values (lambda () (eval form module)) (lambda vs vs))))) (call-with-result ev))) (define (ge:compile-file path) (call-with-result (lambda () (let ((cr (compile-file path #:canonicalization 'absolute #:opts compile-file-opts))) (and cr (list (object->string (save-module-excursion (lambda () (load-compiled cr)))))))))) (define ge:load-file ge:compile-file) (define (ge:macroexpand form . all) (let ((all (and (not (null? all)) (car all)))) (with-output-to-string (lambda () (pretty-print (tree-il->scheme (macroexpand form))))))) (define (add-to-list lst dir) (and (not (member dir lst)))) (define (ge:add-to-load-path dir) (and (file-is-directory? dir) (let ((in-lp (member dir %load-path)) (in-clp (member dir %load-compiled-path))) (when (not in-lp) (set! %load-path (cons dir %load-path))) (when (not in-clp) (set! %load-compiled-path (cons dir %load-compiled-path))) (or in-lp in-clp)))) geiser-0.8.1/scheme/chicken/0000755000175000017500000000000012607252046012653 500000000000000geiser-0.8.1/scheme/chicken/geiser/0000755000175000017500000000000012607252047014132 500000000000000geiser-0.8.1/scheme/chicken/geiser/emacs.scm0000644000175000017500000006452412604324655015663 00000000000000;; Copyright (C) 2015 Daniel J Leslie ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . (module geiser (geiser-eval geiser-no-values geiser-newline geiser-start-server geiser-completions geiser-autodoc geiser-object-signature geiser-symbol-location geiser-symbol-documentation geiser-find-file geiser-add-to-load-path geiser-load-file geiser-compile-file geiser-compile geiser-module-exports geiser-module-path geiser-module-location geiser-module-completions geiser-macroexpand geiser-use-debug-log) (import chicken scheme) (use apropos chicken-doc data-structures extras ports posix srfi-1 srfi-13 srfi-14 srfi-18 srfi-69 tcp utils) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Symbol lists ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define geiser-r4rs-symbols (make-parameter '(not boolean? eq? eqv? equal? pair? cons car cdr caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr set-car! set-cdr! null? list? list length list-tail list-ref append reverse memq memv member assq assv assoc symbol? symbol->string string->symbol number? integer? exact? real? complex? inexact? rational? zero? odd? even? positive? negative? max min + - * / = > < >= <= quotient remainder modulo gcd lcm abs floor ceiling truncate round exact->inexact inexact->exact exp log expt sqrt sin cos tan asin acos atan number->string string->number char? char=? char>? char=? char<=? char-ci=? char-ci? char-ci>=? char-ci<=? char-alphabetic? char-whitespace? char-numeric? char-upper-case? char-lower-case? char-upcase char-downcase char->integer integer->char string? string=? string>? string=? string<=? string-ci=? string-ci? string-ci>=? string-ci<=? make-string string-length string-ref string-set! string-append string-copy string->list list->string substring string-fill! vector? make-vector vector-ref vector-set! string vector vector-length vector->list list->vector vector-fill! procedure? map for-each apply force call-with-current-continuation input-port? output-port? current-input-port current-output-port call-with-input-file call-with-output-file open-input-file open-output-file close-input-port close-output-port load read eof-object? read-char peek-char write display write-char newline with-input-from-file with-output-to-file eval char-ready? imag-part real-part magnitude numerator denominator scheme-report-environment null-environment interaction-environment else))) (define geiser-r5rs-symbols (make-parameter '(abs acos and angle append apply asin assoc assq assv atan begin boolean? caar cadr call-with-current-continuation call-with-input-file call-with-output-file call-with-values car case cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cond cons cos current-input-port current-output-port define define-syntax delay denominator display do dynamic-wind else eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor for-each force gcd if imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lambda lcm length let let* let-syntax letrec letrec-syntax list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector map max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file or output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! setcar sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? syntax-rules tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! vector? with-input-from-file with-output-to-file write write-char zero?))) (define geiser-r7rs-small-symbols (make-parameter '(* + - ... / < <= = => > >= abs and append apply assoc assq assv begin binary-port? boolean=? boolean? bytevector bytevector-append bytevector-copy bytevector-copy! bytevector-length bytevector-u8-ref bytevector-u8-set! bytevector? caar cadr call-with-current-continuation call-with-port call-with-values call/cc car case cdar cddr cdr ceiling char->integer char-ready? char<=? char=? char>? char? close-input-port close-output-port close-port complex? cond cond-expand cons current-error-port current-input-port current-output-port define define-record-type define-syntax define-values denominator do dynamic-wind else eof-object? equal? error error-object-message even? exact-integer-sqrt exact? features floor floor-remainder flush-output-port gcd get-output-string if include-ci inexact? input-port? integer? lcm let let*-values let-values letrec* list list->vector list-ref list-tail make-bytevector make-parameter make-vector max memq min negative? not number->string numerator open-input-bytevector open-output-bytevector or output-port? parameterize peek-u8 positive? quasiquote quotient raise-continuable rationalize read-bytevector! read-error? read-string real? reverse set! set-cdr! string string->number string->utf8 string-append eof-object eq? eqv? error-object-irritants error-object? exact exact-integer? expt file-error? floor-quotient floor/ for-each get-output-bytevector guard include inexact input-port-open? integer->char lambda length let* let-syntax letrec letrec-syntax list->string list-copy list-set! list? make-list make-string map member memv modulo newline null? number? odd? open-input-string open-output-string output-port-open? pair? peek-char port? procedure? quote raise rational? read-bytevector read-char read-line read-u8 remainder round set-car! square string->list string->symbol string->vector string-copy string-copy! string-for-each string-map string-set! string=? string? symbol->string symbol? syntax-rules truncate truncate-remainder u8-ready? unquote utf8->string vector vector->string vector-copy vector-fill! vector-length vector-ref vector? with-exception-handler write-char write-u8 string-fill! string-length string-ref string<=? string=? string>? substring symbol=? syntax-error textual-port? truncate-quotient truncate/ unless unquote-splicing values vector->list vector-append vector-copy! vector-for-each vector-map vector-set! when write-bytevector write-string zero?))) (define geiser-chicken-builtin-symbols (make-parameter '(and-let* assume compiler-typecase cond-expand condition-case cut cute declare define-constant define-inline define-interface define-record define-record-type define-specialization define-syntax-rule define-type define-values dotimes ecase fluid-let foreign-lambda foreign-lambda* foreign-primitive foreign-safe-lambda foreign-safe-lambda* functor handle-exceptions import let*-values let-location let-optionals let-optionals* let-values letrec* letrec-values match-letrec module parameterize regex-case require-extension select set! unless use when with-input-from-pipe match match-lambda match-lambda* match-let match-let* receive))) (define geiser-chicken-crunch-symbols (make-parameter '(* + - / < <= = > >= abs acos add1 argc argv-ref arithmetic-shift asin atan atan2 bitwise-and bitwise-ior bitwise-not bitwise-xor blob->f32vector blob->f32vector/shared blob->f64vector blob->f64vector/shared blob->s16vector blob->s16vector/shared blob->s32vector blob->s32vector/shared blob->s8vector blob->s8vector/shared blob->string blob->string/shared blob->u16vector blob->u16vector/shared blob->u32vector blob->u32vector/shared blob->u8vector blob->u8vector/shared ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? cond-expand cos display display eq? equal? eqv? error even? exact->inexact exact? exit exp expt f32vector->blob f32vector->blob/shared f32vector-length f32vector-ref f32vector-set! f64vector->blob f64vector->blob/shared f64vector-length f64vector-ref f64vector-set! floor flush-output inexact->exact inexact? integer->char integer? log make-f32vector make-f64vector make-s16vector make-s32vector make-s8vector make-string make-u16vector make-u32vector make-u8vector max min modulo negative? newline not number->string odd? pointer-f32-ref pointer-f32-set! pointer-f64-ref pointer-f64-set! pointer-s16-ref pointer-s16-set! pointer-s32-ref pointer-s32-set! pointer-s8-ref pointer-s8-set! pointer-u16-ref pointer-u16-set! pointer-u32-ref pointer-u32-set! pointer-u8-ref pointer-u8-set! positive? quotient rec remainder round s16vector->blob s16vector->blob/shared s16vector-length s16vector-ref s16vector-set! s32vector->blob s32vector->blob/shared s32vector-length s32vector-ref s32vector-set! s8vector->blob s8vector->blob/shared s8vector-length s8vector-ref s8vector-set! sin sqrt string->blob string->blob/shared string->number string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? sub1 subf32vector subf64vector subs16vector subs32vector subs8vector substring subu16vector subu32vector subu8vector switch tan truncate u16vector->blob u16vector->blob/shared u16vector-length u16vector-ref u16vector-set! u32vector->blob u32vector->blob/shared u32vector-length u32vector-ref u32vector-set! u8vector->blob u8vector->blob/shared u8vector-length u8vector-ref u8vector-set! unless void when write-char zero?))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Utilities ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define geiser-use-debug-log (make-parameter #f)) (define find-module ##sys#find-module) (define current-module ##sys#current-module) (define switch-module ##sys#switch-module) (define module-name ##sys#module-name) (define (list-modules) (map car ##sys#module-table)) (define memo (make-parameter (make-hash-table))) (define (clear-memo) (hash-table-clear! (memo))) (define (memoize tag thunk) (let ((table (memo))) (if (hash-table-exists? table tag) (hash-table-ref table tag) (begin (hash-table-set! table tag (thunk)) (memoize tag thunk))))) (define debug-log (make-parameter #f)) (define (write-to-log form) (when (geiser-use-debug-log) (when (not (debug-log)) (debug-log (file-open "geiser.log" (+ open/wronly open/append open/text open/creat))) (set-file-position! (debug-log) 0 seek/end)) (file-write (debug-log) (with-all-output-to-string (lambda () (write form) (newline)))) (file-write (debug-log) "\n"))) (define (remove-internal-name-mangling sym) (let* ((sym (->string sym)) (octothorpe-index (string-index-right sym #\#))) (if octothorpe-index (values (substring/shared sym (add1 octothorpe-index)) (substring/shared sym 0 octothorpe-index)) (values sym '())))) (define (string-has-prefix? s prefix) (let ((s-length (string-length s)) (prefix-length (string-length prefix))) (and (< prefix-length s-length) (string-contains s prefix 0 prefix-length)))) ;; This really should be a chicken library function (define (write-exception exn) (define (write-call-entry call) (let ((type (vector-ref call 0)) (line (vector-ref call 1))) (cond ((equal? type "") (display (string-append type " ")) (write line) (newline)) ((equal? type "") (display (string-append type " ")) (write line) (newline))))) (display (format "Error: (~s) ~s: ~s" ((condition-property-accessor 'exn 'location) exn) ((condition-property-accessor 'exn 'message) exn) ((condition-property-accessor 'exn 'arguments) exn))) (newline) (display "Call history: ") (newline) (map write-call-entry ((condition-property-accessor 'exn 'call-chain) exn)) (newline)) ;; And this should be a chicken library function as well (define (with-all-output-to-string thunk) (with-output-to-string (lambda () (with-error-output-to-port (current-output-port) thunk)))) (define (maybe-call func val) (if val (func val) #f)) ;; Wraps output from geiser functions (define (call-with-result module thunk) (let* ((result (if #f #f)) (output (if #f #f)) (module (maybe-call (lambda (v) (find-module module)) module)) (original-module (current-module))) (set! output (handle-exceptions exn (with-all-output-to-string (lambda () (write-exception exn))) (with-all-output-to-string (lambda () (switch-module module) (call-with-values thunk (lambda v (set! result v))))))) (switch-module original-module) (set! result (cond ((list? result) (map (lambda (v) (with-output-to-string (lambda () (write v)))) result)) ((eq? result (if #f #t)) (list output)) (else (list (with-output-to-string (lambda () (write result))))))) (let ((out-form `((result ,@result) (output . ,output)))) (write out-form) (write-to-log '[[RESPONSE]]) (write-to-log out-form)) (newline))) (define (find-standards-with-symbol sym) (append (if (any (cut eq? <> sym) (geiser-r4rs-symbols)) '(r4rs) '()) (if (any (cut eq? <> sym) (geiser-r5rs-symbols)) '(r5rs) '()) (if (any (cut eq? <> sym) (geiser-r7rs-small-symbols)) '(r7rs) '()) (if (any (cut eq? <> sym) (geiser-chicken-builtin-symbols)) '(chicken) '()) (if (any (cut eq? <> sym) (geiser-chicken-crunch-symbols)) '(crunch) '()))) ;; Locates any paths at which a particular symbol might be located (define (find-library-paths sym types) ;; Removes the given sym from the node path (define (remove-self sym path) (cond ((not (list? path)) path) ((null? path) path) ((null? (cdr path)) (if (eq? (car path) sym) '() path)) (else (cons (car path) (remove-self sym (cdr path)))))) (append (map (cut list <>) (find-standards-with-symbol sym)) (map (lambda (node) (remove-self sym (node-path node))) (filter (lambda (n) (let ((type (node-type n))) (any (cut eq? type <>) types))) (match-nodes sym))))) (define (make-module-list sym module-sym) (if (null? module-sym) (find-standards-with-symbol sym) (cons module-sym (find-standards-with-symbol sym)))) (define (fmt sym node) (let* ((entry-str (car node)) (module (cadr node)) (rest (cddr node)) (type (if (or (list? rest) (pair? rest)) (car rest) rest))) (cond ((equal? 'macro type) `(,entry-str ("args" (("required" ) ("optional" ...) ("key"))) ("module" ,@(make-module-list sym module)))) ((or (equal? 'variable type) (equal? 'constant type)) (if (null? module) `(,entry-str ("value" . ,(eval sym))) (let* ((original-module (current-module)) (desired-module (find-module (string->symbol module))) (value (begin (switch-module desired-module) (eval sym)))) (switch-module original-module) `(,entry-str ("value" . ,value) ("module" ,@(make-module-list sym module)))))) (else (let ((reqs '()) (opts '()) (keys '()) (args (if (or (list? rest) (pair? rest)) (cdr rest) '()))) (define (clean-arg arg) (let ((s (->string arg))) (substring/shared s 0 (string-skip-right s char-set:digit)))) (define (collect-args args #!key (reqs? #t) (opts? #f) (keys? #f)) (when (not (null? args)) (cond ((or (pair? args) (list? args)) (cond ((eq? '#!key (car args)) (collect-args (cdr args) reqs?: #f opts?: #f keys?: #t)) ((eq? '#!optional (car args)) (collect-args (cdr args) reqs?: #f opts?: #t keys?: #f)) (else (begin (cond (reqs? (set! reqs (append reqs (list (clean-arg (car args)))))) (opts? (set! opts (append opts (list (cons (clean-arg (caar args)) (cdar args)))))) (keys? (set! keys (append keys (list (cons (clean-arg (caar args)) (cdar args))))))) (collect-args (cdr args)))))) (else (set! opts (list (clean-arg args) '...)))))) (collect-args args) `(,entry-str ("args" (("required" ,@reqs) ("optional" ,@opts) ("key" ,@keys))) ("module" ,@(make-module-list sym module)))))))) ;; Builds a signature list from an identifier (define (find-signatures sym) (let ((str (->string sym))) (map (cut fmt sym <>) (filter (lambda (v) (eq? (car v) sym)) (map (lambda (s) ;; Remove egg name and add module (let-values (((name module) (remove-internal-name-mangling (car s)))) (cons (string->symbol name) (cons (if (string? module) (string->symbol module) module) (cdr s))))) (apropos-information-list sym #:macros? #t)))))) ;; Builds the documentation from Chicken Doc for a specific symbol (define (make-doc symbol #!optional (filter-for-type #f)) (with-output-to-string (lambda () (map (lambda (node) (display (string-append "= Node: " (->string (node-id node)) " " " =\n")) (describe node) (display "\n\n")) (filter (lambda (n) (or (not filter-for-type) (eq? (node-type n) filter-for-type))) (match-nodes symbol)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Geiser core functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Basically all non-core functions pass through geiser-eval (define (geiser-eval module form . rest) ;; We can't allow nested module definitions in Chicken (define (form-has-module? form) (or (eq? (car form) 'module) (eq? (car form) 'define-library))) (define (form-has-safe-geiser? form) (any (cut eq? (car form) <>) '(geiser-no-values geiser-newline geiser-completions geiser-autodoc geiser-object-signature geiser-symbol-location geiser-symbol-documentation geiser-find-file geiser-add-to-load-path geiser-module-exports geiser-module-path geiser-module-location geiser-module-completions geiser-use-debug-log))) (when (and module (not (symbol? module))) (error "Module should be a symbol")) ;; All calls start at toplevel (let* ((is-module? (form-has-module? form)) (is-safe-geiser? (form-has-safe-geiser? form)) (host-module (and (not is-module?) (any (cut equal? module <>) (list-modules)) module)) (thunk (lambda () (eval form)))) (write-to-log `[[REQUEST host-module ,host-module is-safe-geiser? ,is-safe-geiser?]]) (write-to-log form) (if is-safe-geiser? (call-with-result host-module (lambda () (memoize form thunk))) (begin (clear-memo) (call-with-result host-module thunk))))) ;; Load a file (define (geiser-load-file file) (let* ((file (if (symbol? file) (symbol->string file) file)) (found-file (geiser-find-file #f file))) (call-with-result #f (lambda () (when found-file (load found-file)))))) ;; The no-values identity (define (geiser-no-values) (values)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Miscellaneous ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Invoke a newline (define (geiser-newline . rest) (newline)) ;; Spawn a server for remote repl access (define (geiser-start-server . rest) (let* ((listener (tcp-listen 0)) (port (tcp-listener-port listener))) (define (remote-repl) (receive (in out) (tcp-accept listener) (current-input-port in) (current-output-port out) (current-error-port out) (repl))) (thread-start! (make-thread remote-repl)) (write-to-log `(geiser-start-server . ,rest)) (write-to-log `(port ,port)) (write `(port ,port)) (newline))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Completions, Autodoc and Signature ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (geiser-completions prefix . rest) (let ((prefix (->string prefix)) (unfiltered (map remove-internal-name-mangling (apropos-list prefix #:macros? #t)))) (filter (cut string-has-prefix? <> prefix) unfiltered))) (define (geiser-module-completions prefix . rest) (let ((prefix (->string prefix))) (filter (cut string-has-prefix? <> prefix) (map ->string (list-modules))))) (define (geiser-autodoc ids . rest) (cond ((null? ids) '()) ((not (list? ids)) (geiser-autodoc (list ids))) (else (let ((details (find-signatures (car ids)))) (if (null? details) (geiser-autodoc (cdr ids)) details))))) (define (geiser-object-signature name object . rest) (let* ((sig (geiser-autodoc `(,name)))) (if (null? sig) '() (car sig)))) ;; TODO: Divine some way to support this functionality (define (geiser-symbol-location symbol . rest) '(("file") ("line"))) (define (geiser-symbol-documentation symbol . rest) (let* ((sig (find-signatures symbol))) `(("signature" ,@(car sig)) ("docstring" . ,(make-doc symbol))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; File and Buffer Operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define geiser-load-paths (make-parameter '())) (define (geiser-find-file file . rest) (let ((paths (append '("" ".") (geiser-load-paths)))) (define (try-find file paths) (cond ((null? paths) #f) ((file-exists? (string-append (car paths) file)) (string-append (car paths) file)) (else (try-find file (cdr paths))))) (try-find file paths))) (define (geiser-add-to-load-path directory . rest) (let* ((directory (if (symbol? directory) (symbol->string directory) directory)) (directory (if (not (equal? #\/ (string-ref directory (- (string-length directory))))) (string-append directory "/") directory))) (call-with-result #f (lambda () (when (directory-exists? directory) (geiser-load-paths (cons directory (geiser-load-paths)))))))) (define (geiser-compile-file file . rest) (let* ((file (if (symbol? file) (symbol->string file) file)) (found-file (geiser-find-file file))) (call-with-result #f (lambda () (when found-file (compile-file found-file)))))) ;; TODO: Support compiling regions (define (geiser-compile form module . rest) (error "Chicken does not support compiling regions")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Modules ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Should return: ;; '(("modules" . sub-modules) ("procs" . procedures) ("syntax" . macros) ("vars" . variables)) (define (geiser-module-exports module-name . rest) (let* ((nodes (match-nodes module-name))) (if (null? nodes) '() (let ((mod '()) (proc '()) (syn '()) (var '())) (map (lambda (node) (let ((type (node-type node)) (name (node-id node)) (path (node-path node))) (cond ((memq type '(unit egg)) (set! mod (cons name mod))) ((memq type '(procedure record setter class method)) (set! proc (cons name proc))) ((memq type '(read syntax)) (set! syn (cons name syn))) ((memq type '(parameter constant)) (set! var (cons name var)))))) nodes) `(("modules" . ,mod) ("proces" . ,proc) ("syntax" . ,syn) ("vars" . ,var)))))) ;; Returns the path for the file in which an egg or module was defined (define (geiser-module-path module-name . rest) #f) ;; Returns: ;; `(("file" . ,(module-path name)) ("line")) (define (geiser-module-location name . rest) #f) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Misc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (geiser-macroexpand form . rest) (with-output-to-string (lambda () (write (expand form))))) ;; End module ) geiser-0.8.1/scheme/Makefile.am0000644000175000017500000000113612466037500013223 00000000000000 nobase_dist_pkgdata_DATA = \ guile/geiser/completion.scm \ guile/geiser/doc.scm \ guile/geiser/emacs.scm \ guile/geiser/evaluation.scm \ guile/geiser/modules.scm \ guile/geiser/utils.scm \ guile/geiser/xref.scm \ racket/geiser/autodoc.rkt \ racket/geiser/completions.rkt \ racket/geiser/enter.rkt \ racket/geiser/eval.rkt \ racket/geiser/images.rkt \ racket/geiser/locations.rkt \ racket/geiser/main.rkt \ racket/geiser/modules.rkt \ racket/geiser/server.rkt \ racket/geiser/startup.rkt \ racket/geiser/user.rkt \ racket/geiser/utils.rkt \ chicken/geiser/emacs.scm geiser-0.8.1/scheme/Makefile.in0000644000175000017500000003324012607252021013227 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = scheme ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(nobase_dist_pkgdata_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgdatadir)" DATA = $(nobase_dist_pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ nobase_dist_pkgdata_DATA = \ guile/geiser/completion.scm \ guile/geiser/doc.scm \ guile/geiser/emacs.scm \ guile/geiser/evaluation.scm \ guile/geiser/modules.scm \ guile/geiser/utils.scm \ guile/geiser/xref.scm \ racket/geiser/autodoc.rkt \ racket/geiser/completions.rkt \ racket/geiser/enter.rkt \ racket/geiser/eval.rkt \ racket/geiser/images.rkt \ racket/geiser/locations.rkt \ racket/geiser/main.rkt \ racket/geiser/modules.rkt \ racket/geiser/server.rkt \ racket/geiser/startup.rkt \ racket/geiser/user.rkt \ racket/geiser/utils.rkt \ chicken/geiser/emacs.scm all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scheme/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu scheme/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-nobase_dist_pkgdataDATA: $(nobase_dist_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-nobase_dist_pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-nobase_dist_pkgdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-nobase_dist_pkgdataDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-nobase_dist_pkgdataDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geiser-0.8.1/scheme/racket/0000755000175000017500000000000012607252046012520 500000000000000geiser-0.8.1/scheme/racket/geiser/0000755000175000017500000000000012607252047013777 500000000000000geiser-0.8.1/scheme/racket/geiser/images.rkt0000644000175000017500000000462512466000452015707 00000000000000;;; images.rkt -- support for image handline ;; Copyright (C) 2012, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Authors: Michael Wilber, Jose Antonio Ortega Ruiz ;; Start date: Sun Sep 2, 2012 18:54 #lang racket/base (require racket/file file/convertible racket/pretty) (provide image-cache maybe-print-image maybe-write-image make-port-print-handler make-pretty-print-size-hook make-pretty-print-print-hook) (define image-cache (let ([ensure-dir (lambda (dir) (if (path-string? dir) (begin (make-directory* dir) (if (path? dir) (path->string dir) dir)) (path->string (find-system-path 'temp-dir))))]) (make-parameter (ensure-dir #f) ensure-dir))) (define (save-tmpimage imgbytes) ;; Save imgbytes to a new temporary file and return the filename (define filename (make-temporary-file "geiser-img-~a.png" #f (image-cache))) (with-output-to-file filename #:exists 'truncate (lambda () (display imgbytes))) (format "#" filename)) (define (maybe-save-image value) (and (convertible? value) ;; (The above could be problematic if a future version of racket ;; suddenly decides it can "convert" strings to picts) (save-tmpimage (convert value 'png-bytes)))) (define (maybe-print-image value) (cond [(maybe-save-image value) => (lambda (s) (printf "~a\n" s))] [else (unless (void? value) (pretty-print value))])) (define (maybe-write-image value) (write (or (maybe-save-image value) value))) (define (make-port-print-handler ph) (lambda (value port . rest) (apply ph (or (maybe-save-image value) value) port rest))) (define (make-pretty-print-size-hook [orig (pretty-print-size-hook)]) (lambda (value display? port) (if (convertible? value) (pretty-print-columns) (orig value display? port)))) (define (make-pretty-print-print-hook [orig (pretty-print-print-hook)]) (lambda (value display? port) (let [(img (maybe-save-image value))] (if img (print img port) (orig value display? port))))) geiser-0.8.1/scheme/racket/geiser/completions.rkt0000644000175000017500000000156411623601337017000 00000000000000;;; completions.rkt -- completion support ;; Copyright (C) 2009, 2010 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Apr 26, 2009 19:02 #lang racket (provide symbol-completions module-completions) (require srfi/13 geiser/utils geiser/modules) (define (filter-prefix prefix lst sort?) (filter (lambda (s) (string-prefix? prefix s)) (if sort? (sort lst stringstring (namespace-mapped-symbols)) #t)) (define (module-completions prefix) (filter-prefix prefix (module-list) #f)) geiser-0.8.1/scheme/racket/geiser/main.rkt0000644000175000017500000000327111623601337015365 00000000000000;;; main.rkt -- exported interface for emacs ;; Copyright (C) 2010, 2011 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Wed Mar 31, 2010 21:14 #lang racket/base (provide geiser:eval geiser:compile geiser:load-file geiser:compile-file geiser:macroexpand geiser:completions geiser:module-completions geiser:symbol-location geiser:module-location geiser:module-exports geiser:autodoc geiser:symbol-documentation geiser:help geiser:no-values) (require geiser/eval geiser/modules geiser/completions geiser/locations geiser/autodoc) (define (geiser:eval lang) (lambda (form spec) (update-signature-cache spec form) (eval-in form spec lang))) (define geiser:compile geiser:eval) (define (geiser:load-file file) (update-signature-cache file) (load-file file)) (define geiser:compile-file geiser:load-file) (define geiser:add-to-load-path add-to-load-path) (define geiser:autodoc autodoc) (define geiser:help get-help) (define geiser:completions symbol-completions) (define geiser:module-completions module-completions) (define geiser:symbol-location symbol-location) (define geiser:module-location module-location) (define geiser:module-exports module-exports) (define geiser:macroexpand macroexpand) (define geiser:symbol-documentation symbol-documentation) (define (geiser:no-values) (values)) geiser-0.8.1/scheme/racket/geiser/user.rkt0000644000175000017500000001410612466000452015413 00000000000000;;; user.rkt -- global bindings visible to geiser users ;; Copyright (C) 2010, 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Wed Mar 31, 2010 22:24 #lang racket (provide init-geiser-repl run-geiser-server start-geiser) (require (for-syntax racket/base) mzlib/thread racket/tcp racket/help geiser geiser/autodoc geiser/images geiser/enter geiser/eval geiser/modules) (define top-namespace (current-namespace)) (define last-entered (make-parameter "")) (define (do-enter mod name) (visit-module mod) (last-entered name) (current-namespace (module->namespace mod))) (define (file-mod? mod) (and (list? mod) (= 2 (length mod)) (eq? 'file (car mod)) (path-string? (cadr mod)))) (define (submod-path mod) (and (list? mod) (eq? 'submod (car mod)) (> (length mod) 1) (let ([parent (cadr mod)]) (cond [(path-string? parent) `(submod (file ,parent) ,@(cddr mod))] [(file-mod? parent) mod] [(symbol? parent) mod] [else #f])))) (define (module-error stx mod) (raise-syntax-error #f "Invalid module path" stx mod)) (define (enter! mod stx) (cond [(not mod) (current-namespace top-namespace) (last-entered "")] [(symbol? mod) (do-enter mod (symbol->string mod))] [(path-string? mod) (do-enter `(file ,mod) mod)] [(file-mod? mod) (do-enter mod (cadr mod))] [(submod-path mod) => (lambda (m) (do-enter m m))] [else (module-error stx mod)])) (define (geiser-eval) (define geiser-main (module->namespace 'geiser)) (define (eval-here form) (eval form geiser-main)) (let* ([mod (read)] [lang (read)] [form (read)] [res (cond [(equal? form '(unquote apply)) (let* ([proc (eval-here (read))] [args (map eval-here (read))] [ev (lambda () (apply proc args))]) (eval-in `(,ev) mod lang #t))] [else ((geiser:eval lang) form mod)])]) (datum->syntax #f (list 'quote res)))) (define (geiser-load stx) (let* ([mod (read)] [res (call-with-result (lambda () (visit-module (cond [(file-mod? mod) mod] [(path-string? mod) `(file ,mod)] [(submod-path mod)] [else (module-error stx mod)])) (void)))]) (datum->syntax stx (list 'quote res)))) (define ((geiser-read prompt)) (prompt) (flush-output (current-error-port)) (flush-output (current-output-port)) (let* ([in ((current-get-interaction-input-port))] [form ((current-read-interaction) (object-name in) in)]) (syntax-case form () [(uq cmd) (eq? 'unquote (syntax-e #'uq)) (case (syntax-e #'cmd) [(start-geiser) (datum->syntax #f `(list 'port ,(start-geiser)))] [(enter) (enter! (read) #'cmd)] [(geiser-eval) (geiser-eval)] [(geiser-load) (geiser-load #'cmd)] [(geiser-no-values) (datum->syntax #f (void))] [(add-to-load-path) (add-to-load-path (read))] [(set-image-cache) (image-cache (read))] [(help) (get-help (read) (read))] [(image-cache) (image-cache)] [(pwd) (~a (current-directory))] [(cd) (current-directory (~a (read)))] [else form])] [_ form]))) (define geiser-prompt (lambda () (let ([m (namespace->module-name (current-namespace) (last-entered))]) (printf "racket@~a> " (regexp-replace* " " m "_"))))) (define (geiser-prompt-read prompt) (make-repl-reader (geiser-read prompt))) (define (geiser-loader) (module-loader (current-load/use-compiled))) (define (install-print-handler handler) (let ([p (current-output-port)]) (handler p (make-port-print-handler (handler p))))) (define (install-print-handlers) (for-each install-print-handler (list port-print-handler port-write-handler port-display-handler)) (pretty-print-print-hook (make-pretty-print-print-hook)) (pretty-print-size-hook (make-pretty-print-size-hook))) (define (init-geiser-repl) (compile-enforce-module-constants #f) (current-load/use-compiled (geiser-loader)) (preload-help) (current-prompt-read (geiser-prompt-read geiser-prompt)) (current-print maybe-print-image) (install-print-handlers)) (define (run-geiser-repl in out enforce-module-constants) (parameterize [(compile-enforce-module-constants enforce-module-constants) (current-input-port in) (current-output-port out) (current-error-port out) (current-load/use-compiled (geiser-loader)) (current-prompt-read (geiser-prompt-read geiser-prompt)) (current-print maybe-print-image) (pretty-print-print-hook (make-pretty-print-print-hook)) (pretty-print-size-hook (make-pretty-print-size-hook))] (install-print-handlers) (preload-help) (read-eval-print-loop))) (define server-channel (make-channel)) (define (run-geiser-server port enforce-module-constants (hostname #f)) (run-server port (lambda (in out) (run-geiser-repl in out enforce-module-constants)) #f void (lambda (p _ __) (let ([lsner (tcp-listen p 4 #f hostname)]) (let-values ([(_ p __ ___) (tcp-addresses lsner #t)]) (channel-put server-channel p) lsner))))) (define (start-geiser (port 0) (hostname #f) (enforce-module-constants #f)) (thread (lambda () (run-geiser-server port enforce-module-constants hostname))) (channel-get server-channel)) geiser-0.8.1/scheme/racket/geiser/modules.rkt0000644000175000017500000001634512155402374016120 00000000000000;;; modules.rkt -- module metadata ;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Wed May 06, 2009 02:35 #lang racket (provide load-module ensure-module-spec module-spec->namespace namespace->module-name namespace->module-path-name module-path-name->name module-spec->path-name module-path-index->name module-identifiers module-list submodules) (require srfi/13 syntax/modcode syntax/modresolve geiser/enter) (define (ensure-module-spec spec) (cond [(symbol? spec) spec] [(not (string? spec)) #f] [else `(file ,spec)])) (define (module-spec->namespace spec (lang #f) (current #t)) (define (try-lang) (and lang (with-handlers ([exn? (const #f)]) (load-module lang #f (current-namespace)) (module->namespace lang)))) (or (get-namespace spec) (try-lang) (and current (current-namespace)))) (define nowhere (open-output-nowhere)) (define (load-module spec (port #f) (ns #f)) (parameterize ([current-error-port (or port nowhere)]) (visit-module (ensure-module-spec spec)) (when (namespace? ns) (current-namespace ns)))) (define (namespace->rmp ns) (with-handlers ([exn? (const #f)]) (variable-reference->resolved-module-path (eval '(#%variable-reference) (or ns (current-namespace)))))) (define (namespace->module-path-name ns (p #f)) (let ([rmp (namespace->rmp ns)]) (or (and (resolved-module-path? rmp) (resolved-module-path-name rmp)) p))) (define (module-spec->path-name spec) (and (symbol? spec) (or (get-path spec) (register-path spec (namespace->module-path-name (module-spec->namespace spec #f #f)))))) (define unknown-module-name "*unresolved module*") (define (unix-path->string path) (regexp-replace* "\\\\" (path->string path) "/")) (define (path->name path) (if (path-string? path) (let* ([cpaths (map (compose unix-path->string path->directory-path) (current-library-collection-paths))] [prefix-len (lambda (p) (let ((pl (string-length p))) (if (= pl (string-prefix-length p path)) pl 0)))] [lens (map prefix-len cpaths)] [real-path (substring path (apply max lens))]) (if (absolute-path? real-path) (let-values ([(_ base __) (split-path path)]) (unix-path->string base)) (regexp-replace "\\.[^./]*$" real-path ""))) path)) (define (module-path-name->name path) (cond [(path? path) (module-path-name->name (unix-path->string path))] ;; [(eq? path '#%kernel) "(kernel)"] [(path-string? path) (path->name path)] [(symbol? path) (symbol->string path)] [(list? path) (string-join (map (compose path->name ~a) path) "/")] [else (~a path)])) (define (module-path-index->name mpi) (let ([rmp (module-path-index-resolve mpi)]) (if (resolved-module-path? rmp) (module-path-name->name (resolved-module-path-name rmp)) unknown-module-name))) (define (namespace->module-name ns (p #f)) (module-path-name->name (namespace->module-path-name ns p))) (define (module-identifiers mod) (define (extract-ids ls) (append-map (lambda (idls) (map car (cdr idls))) ls)) (let-values ([(reg syn) (module-compiled-exports (get-module-code (resolve-module-path (ensure-module-spec mod) #f)))]) (values (extract-ids reg) (extract-ids syn)))) (define (skippable-dir? path) (call-with-values (lambda () (split-path path)) (lambda (_ basename __) (member (path->string basename) '(".svn" "compiled"))))) (define path->symbol (compose string->symbol unix-path->string)) (define (path->entry path) (let ([ext (filename-extension path)]) (and ext (or (bytes=? ext #"rkt") (bytes=? ext #"ss")) (not (bytes=? (bytes-append #"main" ext) (path->bytes path))) (let* ([path (unix-path->string path)] [len (- (string-length path) (bytes-length ext) 1)]) (substring path 0 len))))) (define (ensure-path datum) (if (string? datum) (string->path datum) datum)) (define main-rkt (build-path "main.rkt")) (define main-ss (build-path "main.ss")) (define ((visit-module-path reg?) path kind acc) (define (register e p) (when reg? (register-path (string->symbol e) (build-path (current-directory) p))) (values (cons e acc) reg?)) (define (get-main path main) (and (file-exists? main) (build-path path main))) (define (find-main path) (parameterize ([current-directory path]) (or (get-main path main-rkt) (get-main path main-ss)))) (case kind [(file) (let ([entry (path->entry path)]) (if (not entry) acc (register entry path)))] [(dir) (cond [(skippable-dir? path) (values acc #f)] [(find-main path) => (curry register (unix-path->string path))] [else (values acc reg?)])] [else acc])) (define ((find-modules reg?) path acc) (if (directory-exists? path) (parameterize ([current-directory path]) (fold-files (visit-module-path reg?) acc)) acc)) (define (take-while pred lst) (let loop ([lst lst] [acc '()]) (cond [(null? lst) (reverse acc)] [(pred (car lst)) (loop (cdr lst) (cons (car lst) acc))] [else (reverse acc)]))) (define (submodules mod) (let* ([mod-name (if (symbol? mod) mod (get-mod mod))] [mod-str (and (symbol? mod-name) (symbol->string mod-name))]) (if mod-str (let ([ms (member mod-str (module-list))]) (and ms (take-while (lambda (m) (string-prefix? mod-str m)) (cdr ms)))) (find-submodules mod)))) (define (find-submodules path) (and (path-string? path) (let-values ([(dir base ign) (split-path path)]) (and (or (equal? base main-rkt) (equal? base main-ss)) (map (lambda (m) (unix-path->string (build-path dir m))) (remove "main" ((find-modules #f) dir '()))))))) (define (known-modules) (sort (foldl (find-modules #t) '() (current-library-collection-paths)) string. ;; Start date: Wed Mar 31, 2010 21:53 #lang racket/base (require syntax/modcode (for-syntax racket/base) racket/path) (provide get-namespace visit-module module-loader) (struct mod (name load-path timestamp depends) #:transparent) (define (make-mod name path ts code) (let ([deps (if code (apply append (map cdr (module-compiled-imports code))) null)]) (mod name (path->string path) ts deps))) (define loaded (make-hash)) (define (mod->path mod) (with-handlers ([exn? (lambda (_) #f)]) (let ([rp (module-path-index-resolve (module-path-index-join mod #f))]) (resolved-module-path-name rp)))) (define (visit-module mod) (dynamic-require mod #f) (check-latest mod)) (define (module-loader orig) (make-loader orig #f)) (define inhibit-eval (make-parameter #f)) (define (get-namespace mod) (let ([mod (cond [(symbol? mod) mod] [(string? mod) (find-module! (string->path mod) mod)] [(path? mod) (find-module! mod (path->string mod))] [else mod])]) (and mod (with-handlers ([exn? (lambda (_) #f)]) (parameterize ([inhibit-eval #t]) (module->namespace mod)))))) (define (find-module! path path-str) (let ([m (or (hash-ref loaded path #f) (let loop ([ps (remove path (resolve-paths path))] [seen '()]) (cond [(null? ps) #f] [(hash-ref loaded (car ps) #f) => (lambda (m) (add-paths! m (cdr ps)) (add-paths! m (cons path seen)) m)] [else (loop (cdr ps) (cons (car ps) seen))])))]) (list 'file (or (and m (mod-load-path m)) path-str)))) (define (add-paths! m ps) (for-each (lambda (p) (hash-set! loaded p m)) ps)) (define (resolve-paths path) (define (find root rest) (let* ([alt-root (resolve-path root)] [same? (equal? root alt-root)]) (cond [(null? rest) (cons root (if same? '() `(,alt-root)))] [else (let* ([c (car rest)] [cs (cdr rest)] [rps (find (build-path root c) cs)]) (if same? rps (append rps (find (build-path alt-root c) cs))))]))) (let ([cmps (explode-path path)]) (find (car cmps) (cdr cmps)))) (define (notify re? path) (when re? (fprintf (current-error-port) " [re-loading ~a]\n" path))) (define (module-name? name) (and name (not (and (pair? name) (not (car name)))))) (define (module-code re? name path) (get-module-code path "compiled" (lambda (e) (parameterize ([compile-enforce-module-constants #f]) (compile-syntax e))) (lambda (ext loader?) (load-extension ext) #f) #:notify (lambda (chosen) (notify re? chosen)))) (define ((make-loader orig re?) path name) (when (inhibit-eval) (raise (make-exn:fail "namespace not found" (current-continuation-marks)))) (if (module-name? name) ;; Module load: (with-handlers ([(lambda (exn) (and (pair? name) (exn:get-module-code? exn))) ;; Load-handler protocol: quiet failure when a ;; submodule is not found (lambda (exn) (void))]) (let* ([code (module-code re? name path)] [dir (or (current-load-relative-directory) (current-directory))] [path (path->complete-path path dir)] [path (normal-case-path (simplify-path path))]) (define-values (ts real-path) (get-timestamp path)) (add-paths! (make-mod name path ts code) (resolve-paths path)) (parameterize ([current-module-declare-source real-path]) (eval code)))) ;; Not a module: (begin (notify re? path) (orig path name)))) (define (get-timestamp path) (let ([ts (file-or-directory-modify-seconds path #f (lambda () #f))]) (if ts (values ts path) (if (regexp-match? #rx#"[.]rkt$" (path->bytes path)) (let* ([alt-path (path-replace-suffix path #".ss")] [ts (file-or-directory-modify-seconds alt-path #f (lambda () #f))]) (if ts (values ts alt-path) (values -inf.0 path))) (values -inf.0 path))))) (define (check-latest mod) (define mpi (module-path-index-join mod #f)) (define done (make-hash)) (let loop ([mpi mpi]) (define rindex (module-path-index-resolve mpi)) (define rpath (resolved-module-path-name rindex)) (define path (if (pair? rpath) (car rpath) rpath)) (when (path? path) (define npath (normal-case-path path)) (unless (hash-ref done npath #f) (hash-set! done npath #t) (define mod (hash-ref loaded rpath #f)) (when mod (for-each loop (mod-depends mod)) (define-values (ts actual-path) (get-timestamp npath)) (when (> ts (mod-timestamp mod)) (define orig (current-load/use-compiled)) (parameterize ([current-load/use-compiled (make-loader orig #f)] [current-module-declare-name rindex] [current-module-declare-source actual-path]) ((make-loader orig #f) npath (mod-name mod))))))))) geiser-0.8.1/scheme/racket/geiser/server.rkt0000644000175000017500000000067711623601337015756 00000000000000;;; server.rkt -- REPL server ;; Copyright (c) 2010 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Nov 06, 2010 15:15 #lang racket/base (require geiser/user) (provide start-geiser) geiser-0.8.1/scheme/racket/geiser/locations.rkt0000644000175000017500000000334412025125232016425 00000000000000;;; locations.rkt -- locating symbols ;; Copyright (C) 2009, 2010, 2012 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Apr 26, 2009 19:43 #lang racket (provide symbol-location symbol-location* module-location symbol-module symbol-module-name) (require geiser/utils geiser/modules) (define (symbol-location* sym) (let* ([id (namespace-symbol->identifier sym)] [binding (and id (identifier-binding id))]) (if (list? binding) (cons (cadr binding) (resolved-module-path-name (module-path-index-resolve (car binding)))) (cons sym #f)))) (define (switch-extension path) (if (regexp-match? "\\.rkt$" path) (regexp-replace "\\.rkt$" path ".ss") (regexp-replace "\\.ss$" path ".rkt"))) (define (make-location name path line) (let* ([path (if (path? path) (path->string path) #f)] [path (and path (if (file-exists? path) path (switch-extension path)))]) (list (cons "name" name) (cons "file" (or path '())) (cons "line" (or line '()))))) (define (symbol-location sym) (let* ([loc (symbol-location* sym)] [name (car loc)] [path (cdr loc)]) (if path (make-location name path #f) (module-location sym)))) (define symbol-module (compose cdr symbol-location*)) (define symbol-module-name (compose module-path-name->name symbol-module)) (define (module-location sym) (make-location sym (module-spec->path-name sym) 1)) geiser-0.8.1/scheme/racket/geiser/eval.rkt0000644000175000017500000000462312263361143015371 00000000000000;;; eval.rkt -- evaluation ;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun Apr 26, 2009 00:44 #lang racket (provide eval-in load-file macroexpand add-to-load-path make-repl-reader call-with-result) (require geiser/enter geiser/modules geiser/images) (require errortrace/errortrace-lib) (define last-result (void)) (define last-namespace (make-parameter (current-namespace))) (define (exn-key e) (vector-ref (struct->vector e) 0)) (define (set-last-error e) (set! last-result `((error (key . ,(exn-key e))))) (display (exn-message e)) (newline) (newline) (parameterize ([error-context-display-depth 10]) (print-error-trace (current-output-port) e))) (define (write-value v) (with-output-to-string (lambda () (maybe-write-image v)))) (define (set-last-result . vs) (set! last-result `((result ,@(map write-value vs))))) (define (call-with-result thunk) (set-last-result (void)) (let ([output (with-output-to-string (lambda () (parameterize ([current-error-port (current-output-port)]) (with-handlers ([exn? set-last-error]) (call-with-values thunk set-last-result)))))]) (append last-result `(,(cons 'output output))))) (define (eval-in form spec lang . non-top) (write (call-with-result (lambda () (eval (if (null? non-top) (cons '#%top-interaction form) form) (module-spec->namespace spec lang))))) (newline)) (define (load-file file) (load-module file (current-output-port) (last-namespace))) (define (macroexpand form . all) (let ([all (and (not (null? all)) (car all))]) (with-output-to-string (lambda () (pretty-print (syntax->datum ((if all expand expand-once) form))))))) (define (add-to-load-path p) (when (string? p) (let ([p (string->path p)] [cps (current-library-collection-paths)]) (unless (member p cps) (current-library-collection-paths (cons p cps))))) #t) (define (make-repl-reader reader) (lambda () (last-namespace (current-namespace)) (reader))) geiser-0.8.1/scheme/racket/geiser/startup.rkt0000644000175000017500000000072312263361525016145 00000000000000;;; startup.rkt -- entry point ;; Copyright (C) 2009, 2010, 2013, 2014 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sat Apr 25, 2009 22:36 ;; (require errortrace) (require geiser/user) (init-geiser-repl) geiser-0.8.1/scheme/racket/geiser/autodoc.rkt0000644000175000017500000002756412133544614016113 00000000000000;;; autodoc.rkt -- suport for autodoc echo ;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun May 03, 2009 14:45 #lang racket (provide autodoc symbol-documentation module-exports update-signature-cache preload-help get-help) (require racket/help geiser/utils geiser/modules geiser/locations) (define loader-thread #f) (define (preload-help) (set! loader-thread (thread (lambda () (with-output-to-string (lambda () (help meh-i-dont-exist))))))) (define here (current-namespace)) (define (get-help symbol mod) (when loader-thread (thread-wait loader-thread) (set! loader-thread #f)) (if (eq? symbol mod) (get-mod-help mod) (with-handlers ([exn? (lambda (_) (eval `(help ,symbol) here))]) (eval `(help ,symbol #:from ,(ensure-module-spec mod)) here)))) (define (get-mod-help mod) (let-values ([(ids syns) (module-identifiers mod)]) (let ([sym (cond [(not (null? syns)) (car syns)] [(not (null? ids)) (car ids)] [else #f])]) (and sym (get-help sym mod))))) (define (symbol-documentation sym) (let* ([val (value sym (symbol-module sym))] [sign (autodoc* sym)]) (and sign (list (cons "signature" (autodoc* sym #f)) (cons "docstring" (docstring sym val sign)))))) (define (docstring sym val sign) (let* ([mod (assoc "module" (cdr sign))] [mod (if mod (cdr mod) "")] [id (namespace-symbol->identifier sym)] [desc (if (identifier? id) (format "~%~%~a" (describe id sym)) "")]) (if val (format "A ~a in module ~a.~a~a~a" (if (procedure? val) "procedure" "variable") mod (if (procedure? val) "" (format "~%~%Value:~%~% ~a" val)) (if (has-contract? val) (format "~%~%Contract:~%~% ~a" (contract-name (value-contract val))) "") desc) (format "An identifier in module ~a.~a" mod desc)))) ;; Lifted from Eli's interactive.rkt (define (describe id s) (define b (identifier-binding id)) (cond [(not b) (format "`~s' is a toplevel (or unbound) identifier." s)] [(eq? b 'lexical) (format "`~s' is a lexical identifier." s)] [(or (not (list? b)) (not (= 7 (length b)))) "*** internal error, racket changed ***"] [else (let-values ([(source-mod source-id nominal-source-mod nominal-source-id source-phase import-phase nominal-export-phase) (apply values b)]) (let ([aliased (not (eq? s source-id))] [for-syn (eqv? source-phase 1)] [amod (not (equal? source-mod nominal-source-mod))] [aid (not (eq? s nominal-source-id))]) (if (or aliased for-syn amod aid) (string-append "Defined" (if for-syn " for syntax" "") (if aliased (format " as `~s' " source-id) "") (if amod (format " in module ~a\nand required~a in module ~a" (module-path-index->name source-mod) (if (eqv? import-phase 1) "-for-syntax" "") (module-path-index->name nominal-source-mod)) "") (if aid (format ",\nwhere it is defined as `~s'" nominal-source-id) "") ".") "")))])) (define (value id mod) (with-handlers ([exn? (const #f)]) (dynamic-require mod id (const #f)))) (define (autodoc ids) (map (lambda (id) (or (autodoc* id) (list id))) (if (list? ids) ids '()))) (define (autodoc* id (extra #t)) (define (val) (with-handlers ([exn? (const "")]) (parameterize ([error-print-width 60]) (format "~.a" (namespace-variable-value id))))) (and (symbol? id) (let* ([loc (symbol-location* id)] [name (car loc)] [path (cdr loc)] [sgns (and path (find-signatures path name id))] [value (if (and extra sgns (not (list? sgns))) (list (cons "value" (val))) '())] [mod (if (and extra sgns path) (list (cons "module" (module-path-name->name path))) '())]) (and sgns `(,id ("name" . ,name) ("args" ,@(if (list? sgns) (map format-signature sgns) '())) ,@value ,@mod))))) (define (format-signature sign) (if (signature? sign) `(("required" ,@(signature-required sign)) ("optional" ,@(signature-optional sign) ,@(let ((rest (signature-rest sign))) (if rest (list "...") '()))) ("key" ,@(signature-keys sign))) '())) (define signatures (make-hash)) (struct signature (required optional keys rest)) (define (find-signatures path name local-name) (let ([path (if (path? path) (path->string path) path)]) (hash-ref! (hash-ref! signatures path (lambda () (parse-signatures path))) name (lambda () (infer-signatures local-name))))) (define (parse-signatures path) (let ([result (make-hasheq)]) (with-handlers ([exn? (lambda (e) result)]) (with-input-from-file path (lambda () (parameterize ([read-accept-reader #t]) (let loop ([stx (read-syntax path)]) (cond [(eof-object? stx) void] [(syntax->datum stx) => (lambda (datum) (parse-datum! datum result) (loop (read-syntax path)))] [else void])))))) result)) (define (parse-datum! datum store) (with-handlers ([exn? (lambda (_) void)]) (match datum [`(module ,name ,lang (#%module-begin . ,forms)) (for-each (lambda (f) (parse-datum! f store)) forms)] [`(module ,name ,lang . ,forms) (for-each (lambda (f) (parse-datum! f store)) forms)] [`(define ((,name . ,formals) . ,_) . ,_) (add-signature! name formals store)] [`(define (,name . ,formals) . ,_) (add-signature! name formals store)] [`(define ,name (lambda ,formals . ,_)) (add-signature! name formals store)] [`(define ,name (case-lambda ,clauses ...)) (for-each (lambda (c) (add-signature! name (car c) store)) (reverse clauses))] [`(,(or 'struct 'define-struct) ,name ,(? symbol? _) ,(list formals ...) . ,_) (add-signature! name formals store)] [`(,(or 'struct 'define-struct) ,name ,(list formals ...) . ,_) (add-signature! name formals store)] [`(define-for-syntax (,name . ,formals) . ,_) (add-signature! name formals store)] [`(define-for-syntax ,name (lambda ,formals . ,_)) (add-signature! name formals store)] [`(define-syntax-rule (,name . ,formals) . ,_) (add-signature! name formals store)] [`(define-syntax ,name (syntax-rules ,specials . ,clauses)) (for-each (lambda (c) (add-syntax-signature! name (cdar c) store)) (reverse clauses))] [`(define-syntax ,name (lambda ,_ (syntax-case ,_ . ,clauses))) (for-each (lambda (c) (add-syntax-signature! name (cdar c) store)) (reverse clauses))] [`(define-type ,_ . ,cases) (for-each (lambda (c) (add-signature! (car c) (cdr c) store)) cases)] [_ void]))) (define (add-signature! name formals store) (when (symbol? name) (hash-set! store name (cons (parse-formals formals) (hash-ref store name '()))))) (define (add-syntax-signature! name formals store) (when (symbol? name) (hash-set! store name (cons (signature formals '() '() #f) (hash-ref store name '()))))) (define (parse-formals formals) (let loop ([formals formals] [req '()] [opt '()] [keys '()]) (cond [(null? formals) (signature (reverse req) (reverse opt) (reverse keys) #f)] [(symbol? formals) (signature (reverse req) (reverse opt) (reverse keys) formals)] [(pair? (car formals)) (loop (cdr formals) req (cons (car formals) opt) keys)] [(keyword? (car formals)) (let* ((kname (car formals)) (arg-id (cadr formals)) (name (if (pair? arg-id) (list kname (cadr arg-id)) (list kname)))) (loop (cddr formals) req opt (cons name keys)))] [else (loop (cdr formals) (cons (car formals) req) opt keys)]))) (define (infer-signatures name) (with-handlers ([exn:fail:syntax? (const `(,(signature '(...) '() '() #f)))] [exn:fail:contract:variable? (const #f)]) (let ([v (namespace-variable-value name)]) (if (procedure? v) (arity->signatures (procedure-arity v)) 'variable)))) (define (arity->signatures arity) (define (args count) (build-list count (const '_))) (define (arity->signature arity) (cond [(number? arity) (signature (args arity) '() '() #f)] [(arity-at-least? arity) (signature (args (arity-at-least-value arity)) '() '() 'rest)])) (define (conseq? lst) (cond [(< (length lst) 2) (number? (car lst))] [(and (number? (car lst)) (number? (cadr lst)) (eqv? (+ 1 (car lst)) (cadr lst))) (conseq? (cdr lst))] [else #f])) (cond [(and (list? arity) (conseq? arity)) (let ((mi (apply min arity)) (ma (apply max arity))) (list (signature (args mi) (args (- ma mi)) '() #f)))] [(list? arity) (map arity->signature arity)] [else (list (arity->signature arity))])) (define (update-signature-cache path (form #f)) (when (and (string? path) (or (not form) (and (list? form) (not (null? form)) (memq (car form) '(define-syntax-rule struct define-syntax define set! define-struct))))) (hash-remove! signatures path))) (define (module-exports mod) (define (contracted id) (let ([v (value id mod)]) (if (has-contract? v) (list id (cons "info" (contract-name (value-contract v)))) (entry id)))) (define (entry id) (let ((sign (eval `(,autodoc* ',id #f) (module-spec->namespace mod #f #f)))) (if sign (list id (cons "signature" sign)) (list id)))) (define (classify-ids ids) (let loop ([ids ids] [procs '()] [vars '()]) (cond [(null? ids) `(("procs" ,@(map entry (reverse procs))) ("vars" ,@(map list (reverse vars))))] [(procedure? (value (car ids) mod)) (loop (cdr ids) (cons (car ids) procs) vars)] [else (loop (cdr ids) procs (cons (car ids) vars))]))) (let-values ([(ids syn) (module-identifiers mod)]) `(,@(classify-ids ids) ("syntax" ,@(map contracted syn)) ("modules" ,@(map list (or (submodules mod) '())))))) geiser-0.8.1/scheme/racket/geiser/utils.rkt0000644000175000017500000000144111623756503015604 00000000000000;;; utils.rkt -- generic utilities ;; Copyright (C) 2009, 2010 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should ;; have received a copy of the license along with this program. If ;; not, see . ;; Start date: Sun May 03, 2009 03:09 #lang racket (provide pair->list keyword->symbol symbol->keyword) (define (pair->list pair) (let loop ([d pair] [s '()]) (cond [(null? d) (reverse s)] [(symbol? d) (reverse (cons d s))] [else (loop (cdr d) (cons (car d) s))]))) (define keyword->symbol (compose string->symbol keyword->string)) (define (symbol->keyword sym) (string->keyword (format "~a" sym))) geiser-0.8.1/aclocal.m40000644000175000017500000007111012607252020011553 00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_LISPDIR # --------------- AC_DEFUN([AM_PATH_LISPDIR], [AC_PREREQ([2.60])dnl # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= AC_CHECK_PROGS([EMACS], [emacs xemacs], [no]) AC_ARG_VAR([EMACS], [the Emacs editor command]) AC_ARG_VAR([EMACSLOADPATH], [the Emacs library search path]) AC_ARG_WITH([lispdir], [AS_HELP_STRING([--with-lispdir], [override the default lisp directory])], [ lispdir="$withval" AC_MSG_CHECKING([where .elc files should go]) AC_MSG_RESULT([$lispdir])], [ AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [ if test $EMACS != "no"; then if test x${lispdir+set} != xset; then # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly # Some emacsen will start up in interactive mode, requiring C-x C-c to exit, # which is non-obvious for non-emacs users. # Redirecting /dev/null should help a bit; pity we can't detect "broken" # emacsen earlier and avoid running this altogether. AC_RUN_LOG([$EMACS -batch -Q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' conftest.out]) am_cv_lispdir=`sed -n \ -e 's,/$,,' \ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \ conftest.out` rm conftest.out fi fi test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp' ]) lispdir="$am_cv_lispdir" ]) AC_SUBST([lispdir]) ])# AM_PATH_LISPDIR # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR geiser-0.8.1/missing0000755000175000017500000001533112164354530011324 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geiser-0.8.1/Makefile.am0000644000175000017500000000263612571717224011772 00000000000000SUBDIRS = . elisp scheme bin doc EXTRA_DIST = THANKS README.elpa dist-hook: $(SHELL) $(top_srcdir)/ChangeLog > $(top_distdir)/ChangeLog elpa_name = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) elpa_dir = $(abs_top_builddir)/$(elpa_name) elpa_slogan = "GNU Emacs and Scheme talk to each other" geiser_el = $(elpa_dir)/geiser.el bin_dir = $(elpa_dir)/bin scheme_dir = $(elpa_dir)/scheme elpa: README.elpa info rm -rf $(elpa_dir) $(mkdir_p) $(elpa_dir) echo '(define-package "geiser" "$(PACKAGE_VERSION)" $(elpa_slogan))' \ > $(elpa_dir)/geiser-pkg.el $(INSTALL_DATA) $(abs_top_srcdir)/elisp/*.el \ $(elpa_dir) $(mkdir_p) $(scheme_dir)/guile/geiser $(mkdir_p) $(scheme_dir)/racket/geiser $(mkdir_p) $(scheme_dir)/chicken/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/guile/geiser/* \ $(scheme_dir)/guile/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/racket/geiser/* \ $(scheme_dir)/racket/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/chicken/geiser/* \ $(scheme_dir)/chicken/geiser $(INSTALL_DATA) $(srcdir)/doc/geiser.info $(elpa_dir) (cd $(elpa_dir) && install-info --dir=dir geiser.info 2>/dev/null) $(INSTALL_DATA) $(top_srcdir)/README.elpa $(elpa_dir)/README $(mkdir_p) $(bin_dir) $(INSTALL) $(top_srcdir)/bin/geiser-racket.sh $(bin_dir) rm -f $(elpa_name).tar tar cf $(elpa_name).tar $(elpa_name) geiser-0.8.1/configure.ac0000644000175000017500000000154012607251353012211 00000000000000# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose A Ortega Ruiz. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. AC_INIT([Geiser],[0.8.1],[geiser-users@nongnu.org],geiser) AC_CONFIG_SRCDIR([elisp/geiser.el]) AM_INIT_AUTOMAKE AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_MKDIR_P AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, no) AM_PATH_LISPDIR AC_CONFIG_FILES([ Makefile elisp/Makefile elisp/geiser-version.el elisp/geiser-load.el scheme/Makefile bin/Makefile doc/Makefile ]) AC_OUTPUT geiser-0.8.1/COPYING0000644000175000017500000000310611623601335010752 00000000000000Unless otherwise specified, all files in this package are subject to the Modified BSD License (also known as BSD3), as follows: ----------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------- geiser-0.8.1/bin/0000755000175000017500000000000012607252047010554 500000000000000geiser-0.8.1/bin/geiser-racket.sh0000755000175000017500000000131612216414720013553 00000000000000#!/bin/bash #| topdir=$(dirname $0) elpa_scheme=$topdir/scheme in_scheme=$topdir/../scheme top=$(if [ -d $elpa_scheme ]; then echo $elpa_scheme; else echo $in_scheme; fi) exec racket -i -S "$top/racket" -l errortrace -cu "$0" ${1+"$@"} |# #lang racket/base (require (lib "cmdline.rkt")) (require geiser/server) (define port (make-parameter 0)) (define host (make-parameter #f (lambda (h) (and (string? h) h)))) (command-line "run-racket.sh" (current-command-line-arguments) (once-each (("-n" "--hostname") n "Network hostname, or #f for all interfaces" (host n)) (("-p" "--port") p "Geiser server port" (port (string->number p))))) (printf "Geiser server running at port ~a~%" (start-geiser (port) (host))) geiser-0.8.1/bin/Makefile.am0000644000175000017500000000072711623601333012527 00000000000000EXTRA_DIST = geiser-racket.sh dist_bin_SCRIPTS = geiser-racket noinst_SCRIPTS = geiser-racket-noinst CLEANFILES = $(dist_bin_SCRIPTS) $(noinst_SCRIPTS) geiser-racket: $(srcdir)/geiser-racket.sh @sed -e "s|top=\".*\"|top=$(datarootdir)/geiser|" \ $(srcdir)/geiser-racket.sh >$@ @chmod +x $@ geiser-racket-noinst: $(srcdir)/geiser-racket.sh @sed -e "s|top=\".*\"|top=$(abs_top_srcdir)/scheme|" \ $(srcdir)/geiser-racket.sh >$@ @chmod +x $@ geiser-0.8.1/bin/geiser-racket0000755000175000017500000000131612607252043013144 00000000000000#!/bin/bash #| topdir=$(dirname $0) elpa_scheme=$topdir/scheme in_scheme=$topdir/../scheme top=$(if [ -d $elpa_scheme ]; then echo $elpa_scheme; else echo $in_scheme; fi) exec racket -i -S "$top/racket" -l errortrace -cu "$0" ${1+"$@"} |# #lang racket/base (require (lib "cmdline.rkt")) (require geiser/server) (define port (make-parameter 0)) (define host (make-parameter #f (lambda (h) (and (string? h) h)))) (command-line "run-racket.sh" (current-command-line-arguments) (once-each (("-n" "--hostname") n "Network hostname, or #f for all interfaces" (host n)) (("-p" "--port") p "Geiser server port" (port (string->number p))))) (printf "Geiser server running at port ~a~%" (start-geiser (port) (host))) geiser-0.8.1/bin/Makefile.in0000644000175000017500000003361212607252021012536 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = bin ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_bin_SCRIPTS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(dist_bin_SCRIPTS) $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = geiser-racket.sh dist_bin_SCRIPTS = geiser-racket noinst_SCRIPTS = geiser-racket-noinst CLEANFILES = $(dist_bin_SCRIPTS) $(noinst_SCRIPTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu bin/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-dist_binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_binSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_binSCRIPTS install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_binSCRIPTS .PRECIOUS: Makefile geiser-racket: $(srcdir)/geiser-racket.sh @sed -e "s|top=\".*\"|top=$(datarootdir)/geiser|" \ $(srcdir)/geiser-racket.sh >$@ @chmod +x $@ geiser-racket-noinst: $(srcdir)/geiser-racket.sh @sed -e "s|top=\".*\"|top=$(abs_top_srcdir)/scheme|" \ $(srcdir)/geiser-racket.sh >$@ @chmod +x $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geiser-0.8.1/NEWS0000644000175000017500000002032212607251432010417 00000000000000* Version 0.8.1 (Oct 13, 2015) Bug fix: font-lock-ensure is from the future. * Version 0.8 (Oct 12, 2015) Improved features: - Lots of improvements to Chicken support, by Dan Leslie. - Better interoperability with xscheme. - Much better performance for long lists of completions or evaluated values. - Better highlighting and indentation rules, by Alex Kost and Dan Leslie. - Make completion work for quoted symbols. Bug fixes: - geiser-connect-local working again. * Version 0.7 "Freija" (Feb 21, 2015) This release is dedicated to Dan's three-months-old daughter Freija, who shared her dad's lap with his laptop while he was hacking on the new Chicken scheme support for Geiser. New features: - Chicken support, by Dan Leslie. Improved features: - `company-mode' support completed with a method for `doc-buffer'. - Support for multiple image display in Racket, including image objects embedded in structured values (thanks to Greg Hendershott). * Version 0.6 (Aug 9, 2014) New features: - New customizable variables `geiser-debug-jump-to-debug-p` and `geiser-debug-show-debug-p`. - Better fontification of some scheme keywords (thanks to Diogo F. S. Ramos). Bug fixes: - Better support for Typed Racket: (re)definitions now work for typed/racket modules (thanks to Sam Tobin-Hochstadt). - Better behaviour for geiser-eval-buffer in racket buffers that contain a #lang directive. But you'd better use C-c C-k instead. - Better behaviour of C-c C-c when interrupting looping functions in the REPL. - Fixes for Makefile target html-am (as in now it works). * Version 0.5 (Dec 9, 2013) New features: - Geiser is now available from MELPA, with the help of Steve Purcell. - Racket: new commands geiser-racket-{show, hide, toggle}-submodules, for folding submodule forms in code buffers. - Racket: interaction with submodules (entering them and evaluation within their scope). - New commands geiser-eval-buffer (C-c C-b) and geiser-eval-buffer-and-go (C-c M-b), by Nick Parker. - Pressing return on a previous expression in the REPL will resend it, by Darren Hoo. - Improvements to syntax highlighting (define/match in racket). - Version checks for the underlying Scheme process, thanks to an idea of B Batsov. Bug fixes: - Autodoc for Guile 2.0.9+'s subr fixed, thanks to Ludovic Courtès. - Fixed problem when saving REPL history that contained non-ASCII chars: all UTF-8 characters should be fair game now. - Fixed problems with geiser-doc's history being handled by session.el (by not letting the latter handle it). - Paths in `geiser-load-path' are now also added to `%load-compiled-path'. Ditto for paths added via `geiser-add-to-load-path`. - Compatibility fixes for Emacs snapshots. * Version 0.4 (May 2, 2013) New features: - New command geiser-insert-lambda, bound to C-c \ in Scheme buffers (thanks to Ray Racine). - Configurable case-sensitivity when highlighting keywords (thanks to Diogo F.S. Ramos), via geiser-guile-case-sensitive-p and geiser-racket-case-sensitive-pp - C-u C-x C-e to insert evaluation result in buffer (thanks to Diogo). - New flag geiser-repl-query-on-kill-p to control whether emacs will ask for confirmation before killing a buffer with a live REPL process. - New flag geiser-mode-start-repl-p to tell Geiser to start a new REPL if one isn't active when geiser-mode is activated. Bug fixes: - Filename completion should also work in emacs 23.2 now. - Racket filenames with spaces no longer break Geiser when entering them (thanks to Diogo). - The REPL no longer hangs when company-mode is active (thanks to Aleix Conchillo). - Help manual lookup in Racket fixed for #lang racket/base modules. * Version 0.3 (Jan 19, 2013) New features: - TAB in a string context in the REPL and Scheme buffers triggers filename completion. - User manual lookup command (C-c C-d i) available also in the REPL. - New REPL command, geiser-repl-clear-buffer (C-c M-o), to remove all scheme output (thanks to Jonas Rodrigues). - Indentation of scheme forms improved.. Bug fixes: - Racket: fixes for problems entering modules sans main.rkt. - Racket: image support in Windows fixed. * Version 0.2.2 (Sep 30, 2012) - ELPA support. We have now ELPA packages. Thanks to Grant Rettke and Daniel Hackney. * Version 0.2.1 (Sep 15, 2012) Bug fixes: - Racket: correctly reloading modules that contain submodules (this one was breaking for instance code based on plai-typed). - Racket: correctly jumping to symbols defined in files with .ss extension. New features: - Racket: autodoc now displays argument names for constructors defined by define-type (from either plai or plai-type). - Racket: the included geiser-racket.sh script takes a new switch, -n, to specify the network interface to listen to. * Version 0.2 (Sep 3, 2012) New features: - Support for images in Racket, both in the REPL and during evaluations. Thanks to Michael Wilber for code, discussion and testing. - Support for Racket 5.3. Older Rackets not actively supported. - ,cd command in Racket's REPL. - New customizable variable, geiser-guile-manual-lookup-nodes, to specify the name of Guile's info nodes, if need be. Bug fixes: - We don't deactivate autodoc in the REPL unless requested. - Indentation for syntax-id-rules and for/hash. - Highlighting of [else forms in scheme buffers. - Indentation for all 'for' forms in Racket. - Correctly buttonizing paths with leading spaces in DBG buffers - Autodoc was being deactivated in REPLs. * Version 0.1.4 (Nov 26, 2011) New features: - Indentation for Racket's splicing-let and friends. - Customizable prompt waiting time (geiser-repl-startup-time). - New customizable faces: geiser-font-lock-repl-prompt and geiser-font-lock-repl-input. Bug fixes: - C-c C-r and friends won't send unbalanced sexps to Scheme. - C-c C-z works after run-geiser in a Scheme buffer. - REPL: TAB indenting around whitespace. - Racket: correct display of output to standard error (such as rackunit's). - Guile: ditto. - Elisp: compatibility problems with filladapt fixed. - Racket: autodoc in R5RS modules. * Version 0.1.3 (Jun 24, 2011) Bug fixes: - The REPL doesn't break when one calls read (fixes bug #33090). - In Guile buffers, C-c C-a (a.k.a C-u C-c C-z) recognizes the current module even before the define-module form (fixes bug #33497). - Racket can now use the GUI libraries (see bug #32844). - Texinfo formatting fixes. * Version 0.1.2 (Mar 9, 2011) New features: - New C-c C-e C-l (or C-c C-r in REPL) to add a directory to Scheme's load path. - Guile 2.0 as lowest Guile version supported. - New custom variable, geiser-guile-load-init-file-p, to allow loading of ~/.guile. Bug fixes: - We no longer ignore geiser-repl-use-other-window. - Company mode integration fixes (including #32231). - M-x geiser-edit-module in REPL buffers fixed. - We now respect user customizations of geiser-implementations-alist. - Interaction with Guile's debugger fixed. - "Clickable" paths in warnings buffer also for Guile 2.0. - Fix for errors when entering r5rs modules in Racket. * Version 0.1.1 (Jan 24, 2011) New features: - "Manual autodoc" command; C-c C-d s. - Autodoc retrieval is now asynchronous, for better behaviour in remote connections. - New C-c C-a to switch to REPL and enter module (C-c C-Z was broken). - Racket: ',enter "foo"' as a synonym of ',enter (file "foo")'. - Documentation typos, and grammar and layout fixes. Bug fixes: - Avoiding *spurious* buffers in case of communication errors. - REPL: fixed problem with input history navigation in Racket. - Autodoc no longer skips non-alphanumeric identifiers. - Autodoc messages no longer interfere with active minibuffer. - Fix for module name completion in Guile. - Quack compatibility: avoiding problems with #f &c. * Version 0.1 (Dec 20, 2010) Initial release. geiser-0.8.1/Makefile.in0000644000175000017500000006071012607252021011765 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ INSTALL NEWS README THANKS install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . elisp scheme bin doc EXTRA_DIST = THANKS README.elpa elpa_name = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) elpa_dir = $(abs_top_builddir)/$(elpa_name) elpa_slogan = "GNU Emacs and Scheme talk to each other" geiser_el = $(elpa_dir)/geiser.el bin_dir = $(elpa_dir)/bin scheme_dir = $(elpa_dir)/scheme all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile dist-hook: $(SHELL) $(top_srcdir)/ChangeLog > $(top_distdir)/ChangeLog elpa: README.elpa info rm -rf $(elpa_dir) $(mkdir_p) $(elpa_dir) echo '(define-package "geiser" "$(PACKAGE_VERSION)" $(elpa_slogan))' \ > $(elpa_dir)/geiser-pkg.el $(INSTALL_DATA) $(abs_top_srcdir)/elisp/*.el \ $(elpa_dir) $(mkdir_p) $(scheme_dir)/guile/geiser $(mkdir_p) $(scheme_dir)/racket/geiser $(mkdir_p) $(scheme_dir)/chicken/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/guile/geiser/* \ $(scheme_dir)/guile/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/racket/geiser/* \ $(scheme_dir)/racket/geiser $(INSTALL_DATA) $(abs_top_srcdir)/scheme/chicken/geiser/* \ $(scheme_dir)/chicken/geiser $(INSTALL_DATA) $(srcdir)/doc/geiser.info $(elpa_dir) (cd $(elpa_dir) && install-info --dir=dir geiser.info 2>/dev/null) $(INSTALL_DATA) $(top_srcdir)/README.elpa $(elpa_dir)/README $(mkdir_p) $(bin_dir) $(INSTALL) $(top_srcdir)/bin/geiser-racket.sh $(bin_dir) rm -f $(elpa_name).tar tar cf $(elpa_name).tar $(elpa_name) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geiser-0.8.1/README.elpa0000644000175000017500000000315412466037620011530 00000000000000Geiser is a generic Emacs/Scheme interaction mode, featuring an enhanced REPL and a set of minor modes improving Emacs' basic scheme major mode. Geiser supports Racket and Guile. Main functionalities: - Evaluation of forms in the namespace of the current module. - Macro expansion. - File/module loading. - Namespace-aware identifier completion (including local bindings, names visible in the current module, and module names). - Autodoc: the echo area shows information about the signature of the procedure/macro around point automatically. - Jump to definition of identifier at point. - Direct access to documentation, including docstrings (when the implementation provides them) and user manuals. - Listings of identifiers exported by a given module (Guile). - Listings of callers/callees of procedures (Guile). - Rudimentary support for debugging (list of evaluation/compilation error in an Emacs' compilation-mode buffer). - Support for inline images in schemes, such as Racket, that treat them as first order values. Chicken Addendum: These steps are necessary to fully support Chicken Scheme, but are not required for any other scheme. - Install the necessary support eggs: $ chicken-install -s apropos chicken-doc - Update the Chicken documentation database: $ cd `csi -p '(chicken-home)'` $ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx See http://www.nongnu.org/geiser/ for the full manual in HTML form, or the the info manual installed by this package. Author: http://jao.io