diff options
| -rw-r--r-- | geiser-guile.el | 67 | ||||
| -rw-r--r-- | readme.org | 4 | 
2 files changed, 52 insertions, 19 deletions
| diff --git a/geiser-guile.el b/geiser-guile.el index fc8f3c8..5d181c4 100644 --- a/geiser-guile.el +++ b/geiser-guile.el @@ -1,20 +1,21 @@ -;;; geiser-guile.el -- guile's implementation of the geiser protocols +;;; geiser-guile.el --- Guile's implementation of the geiser protocols  -*- lexical-binding: t; -*- -;; Copyright (C) 2009-2020 Jose Antonio Ortega Ruiz +;; Copyright (C) 2009-2021 Jose Antonio Ortega Ruiz  ;; Start date: Sun Mar 08, 2009 23:03  ;; Author: Jose Antonio Ortega Ruiz (jao@gnu.org)  ;; Maintainer: Jose Antonio Ortega Ruiz (jao@gnu.org)  ;; Keywords: languages, guile, scheme, geiser  ;; Homepage: https://gitlab.com/emacs-geiser/guile -;; Package-Requires: ((emacs "24.4") (geiser-core "1.0")) +;; Package-Requires: ((emacs "24.4") (geiser "0.12"))  ;; SPDX-License-Identifier: BSD-3-Clause -;; Version: 1.0 +;; Version: 0.13  ;; This file is NOT part of GNU Emacs.  ;;; Commentary: -;; geiser-guile extends the `geiser' core package to support GNU + +;; This package extends the `geiser' core package to support GNU  ;; Guile. @@ -51,7 +52,7 @@  (geiser-custom--defcustom geiser-guile-load-path nil    "A list of paths to be added to Guile's load path when it's started. -The paths are added to both %load-path and %load-compiled path, +The paths are added to both %`load-path' and %load-compiled path,  and only if they are not already present.  This variable is a  good candidate for an entry in your project's .dir-locals.el."    :type '(repeat file) @@ -74,13 +75,13 @@ this variable to t."  (geiser-custom--defcustom geiser-guile-debug-show-bt-p nil    "Whether to automatically show a full backtrace when entering the debugger. -If `nil', only the last frame is shown." +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 automatically jump to error when entering the debugger. -If `t', Geiser will use `next-error' to jump to the error's location." +If t, Geiser will use `next-error' to jump to the error's location."    :type 'boolean    :group 'geiser-guile) @@ -93,9 +94,9 @@ If `t', Geiser will use `next-error' to jump to the error's location."    "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 +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. +unused-toplevel.  Unrecognised symbols are ignored.  The predefined levels are: @@ -104,7 +105,7 @@ The predefined levels are:    - None: no warnings  Changes to the value of this variable will automatically take -effect on new REPLs. For existing ones, use the command +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) @@ -129,7 +130,7 @@ effect on new REPLs. For existing ones, use the command  (geiser-custom--defcustom geiser-guile-manual-lookup-nodes      '("Guile" "guile-2.0") -  "List of info nodes that, when present, are used for manual lookups" +  "List of info nodes that, when present, are used for manual lookups."    :type '(repeat string)    :group 'geiser-guile) @@ -137,6 +138,7 @@ effect on new REPLs. For existing ones, use the command  ;;; REPL support:  (defun geiser-guile--binary () +  "Return the name of the Guile binary to execute."    (if (listp geiser-guile-binary)        (car geiser-guile-binary)      geiser-guile-binary)) @@ -165,9 +167,11 @@ This function uses `geiser-guile-init-file' if it exists."  ;;; Evaluation support:  (defsubst geiser-guile--linearize-args (args) +  "Concatenate the list ARGS."    (mapconcat 'identity args " "))  (defun geiser-guile--geiser-procedure (proc &rest args) +  "Transform PROC in string for a scheme procedure using ARGS."    (cl-case proc      ((eval compile) (format ",geiser-eval %s %s%s"                              (or (car args) "#f") @@ -184,6 +188,7 @@ This function uses `geiser-guile-init-file' if it exists."    "(library +\\(([^)]+)\\)")  (defun geiser-guile--get-module (&optional module) +  "Find current buffer's module using MODULE as a hint."    (cond ((null module)           (save-excursion             (geiser-syntax--pop-to-top) @@ -201,6 +206,7 @@ This function uses `geiser-guile-init-file' if it exists."          (t :f)))  (defun geiser-guile--module-cmd (module fmt &optional def) +  "Use FMT to format a change to MODULE, with default DEF."    (when module      (let* ((module (geiser-guile--get-module module))             (module (cond ((or (null module) (eq module :f)) def) @@ -208,15 +214,20 @@ This function uses `geiser-guile-init-file' if it exists."        (and module (format fmt module)))))  (defun geiser-guile--import-command (module) +  "Format a REPL command to use MODULE."    (geiser-guile--module-cmd module ",use %s"))  (defun geiser-guile--enter-command (module) +  "Format a REPL command to enter MODULE."    (geiser-guile--module-cmd module ",m %s" "(guile-user)")) -(defun geiser-guile--exit-command () ",q") +(defun geiser-guile--exit-command () +  "Format a REPL command to quit." +  ",q")  (defun geiser-guile--symbol-begin (module) +  "Find beginning of symbol in the context of MODULE."    (if module        (max (save-excursion (beginning-of-line) (point))             (save-excursion (skip-syntax-backward "^(>") (1- (point)))) @@ -226,6 +237,7 @@ This function uses `geiser-guile-init-file' if it exists."  ;;; Error display  (defun geiser-guile--enter-debugger () +  "Tell Geiser to interact with the 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) @@ -239,7 +251,8 @@ This function uses `geiser-guile-init-file' if it exists."                               0.2 nil t)        (ignore-errors (next-error))))) -(defun geiser-guile--display-error (module key msg) +(defun geiser-guile--display-error (_module key msg) +  "Display error with given KEY and message MSG."    (when (stringp msg)      (save-excursion (insert msg))      (geiser-edit--buttonize-files)) @@ -253,6 +266,7 @@ This function uses `geiser-guile-init-file' if it exists."            geiser-guile--module-re))  (defun geiser-guile--guess () +  "Ascertain whether we are in a Guile file."    (save-excursion      (goto-char (point-min))      (re-search-forward geiser-guile--guess-re nil t))) @@ -288,6 +302,7 @@ This function uses `geiser-guile-init-file' if it exists."      "with-output-to-string"))  (defun geiser-guile--keywords () +  "Return Guile-specific scheme keywords."    (append     (geiser-syntax--simple-keywords geiser-guile-extra-keywords)     (geiser-syntax--simple-keywords geiser-guile--builtin-keywords) @@ -329,9 +344,11 @@ This function uses `geiser-guile-init-file' if it exists."  (defconst geiser-guile--rel-path-rx "^In +\\([^/\n :]+\\):\n") -(defvar geiser-guile--file-cache (make-hash-table :test 'equal)) +(defvar geiser-guile--file-cache (make-hash-table :test 'equal) +  "Internal cache.")  (defun geiser-guile--resolve-file (file) +  "Find the given FILE, if it's indeed a file."    (when (and (stringp file)               (not (member file '("socket" "stdin" "unknown file"))))      (if (file-name-absolute-p file) file @@ -341,6 +358,7 @@ This function uses `geiser-guile-init-file' if it exists."                     geiser-guile--file-cache)))))  (defun geiser-guile--resolve-file-x () +  "Check if last match contain a resolvable file."    (let ((f (geiser-guile--resolve-file (match-string-no-properties 1))))      (and (stringp f) (list f)))) @@ -350,6 +368,7 @@ This function uses `geiser-guile-init-file' if it exists."  (defconst geiser-guile-minimum-version "2.2")  (defun geiser-guile--version (binary) +  "Find Guile's version running BINARY."    (car (process-lines binary "-c" "(display (version))")))  (defun geiser-guile-update-warning-level () @@ -360,6 +379,7 @@ The new level is set using the value of `geiser-guile-warning-level'."                        (geiser evaluation))))      (geiser-eval--send/result code))) +;;;###autoload  (defun connect-to-guile ()    "Start a Guile REPL connected to a remote process. @@ -369,6 +389,7 @@ it spawn a server thread."    (geiser-connect 'guile))  (defun geiser-guile--set-geiser-load-path () +  "Set up scheme load path for REPL."    (let* ((path geiser-guile-scheme-dir)           (witness "geiser/emacs.scm")           (code `(begin (if (not (%search-load-path ,witness)) @@ -377,6 +398,7 @@ it spawn a server thread."      (geiser-eval--send/wait code)))  (defun geiser-guile--startup (remote) +  "Startup function, for a remote connection if REMOTE is t."    (set (make-local-variable 'compilation-error-regexp-alist)         `((,geiser-guile--path-rx geiser-guile--resolve-file-x)           ("^  +\\([0-9]+\\):\\([0-9]+\\)" nil 1 2))) @@ -398,6 +420,7 @@ it spawn a server thread."  ;;; Manual lookup  (defun geiser-guile--info-spec (&optional nodes) +  "Return info specification for given NODES."    (let* ((nrx "^[       ]+-+ [^:]+:[    ]*")           (drx "\\b")           (res (when (Info-find-file "r5rs" t) @@ -415,7 +438,8 @@ it spawn a server thread."                        :regexp "[^()`',\"        \n]+"                        :doc-spec (geiser-guile--info-spec)) -(defun guile--manual-look-up (id mod) +(defun geiser-guile--manual-look-up (id _mod) +  "Look for ID in the Guile manuals."    (let ((info-lookup-other-window-flag           geiser-guile-manual-lookup-other-window-p))      (info-lookup-symbol (symbol-name id) 'geiser-guile-mode)) @@ -442,12 +466,19 @@ it spawn a server thread."    (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) +  (external-help geiser-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) - +;;;###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) +  (provide 'geiser-guile) +;;; geiser-guile.el ends here @@ -3,8 +3,10 @@  This package provides support for using [[https://www.gnu.org/software/guile/][GNU Guile]] in Emacs with  [[http://geiser.nongnu.org][Geiser]]. -Provided [[https://gitlab.com/emacs-geiser/core][geiser-core]] is installed in your system, if this package's +Provided [[https://gitlab.com/emacs-geiser/geiser][geiser]] is installed in your system, if this package's  directory is in your load path, just add ~(require 'geiser-guile)~ to  your initialisation files and then ~M-x run-guile~ to start a REPL.  Scheme files with a Guile module declaration should be automatically  recognised as Guile-flavoured Geiser buffers. + +The easiest way of installing this package is using MELPA. | 
