diff options
| -rw-r--r-- | elisp/geiser-autodoc.el | 16 | ||||
| -rw-r--r-- | elisp/geiser-repl.el | 4 | ||||
| -rw-r--r-- | elisp/geiser-syntax.el | 12 | ||||
| -rw-r--r-- | scheme/guile/geiser/doc.scm | 31 | 
4 files changed, 52 insertions, 11 deletions
diff --git a/elisp/geiser-autodoc.el b/elisp/geiser-autodoc.el index 4e8a5bf..d6424b4 100644 --- a/elisp/geiser-autodoc.el +++ b/elisp/geiser-autodoc.el @@ -46,6 +46,10 @@    'font-lock-function-name-face    geiser-autodoc "highlighting procedure name in autodoc messages") +(geiser-custom--defface autodoc-optional-arg-marker +  'font-lock-keyword-face +  geiser-autodoc "highlighting #:opt marker in autodoc messages") +  (defcustom geiser-autodoc-delay 0.2    "Delay before autodoc messages are fetched and displayed, in seconds."    :type 'number @@ -75,7 +79,8 @@ when `geiser-autodoc-display-module-p' is on."    (if (equal (car geiser-autodoc--last) form) (cdr geiser-autodoc--last)      (when form        (let ((res (geiser-eval--send/result -                  `(:eval ((:ge autodoc) (quote (:scm ,form))))))) +                  `(:eval ((:ge autodoc) (quote (:scm ,form)))) +                  500)))          (when (and res (listp res))            (setq geiser-autodoc--last                  (cons form @@ -86,14 +91,17 @@ when `geiser-autodoc-display-module-p' is on."  (defun geiser-autodoc--insert-arg (arg current pos)    (let ((p (point)) -        (str (format "%s" (if (eq arg '\#:rest) "." arg)))) +        (str (format "%s" (if (eq arg '\#:rest) "." arg))) +        (face (or (and (eq '\#:opt arg) +                       'geiser-font-lock-autodoc-optional-arg-marker) +                  (and (= current pos) +                       'geiser-font-lock-autodoc-current-arg))))      (insert str)      (when (listp arg)        (save-excursion          (replace-regexp "(quote \\(.*\\))" "'\\1" nil p (point))          (replace-string "nil" "()" t p (point)))) -    (when (= current pos) -      (put-text-property p (point) 'face 'geiser-font-lock-autodoc-current-arg)))) +    (when face (put-text-property p (point) 'face face))))  (defsubst geiser-autodoc--proc-name (proc module)    (let ((str (if module diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el index 9d01835..c542a66 100644 --- a/elisp/geiser-repl.el +++ b/elisp/geiser-repl.el @@ -132,7 +132,7 @@ REPL buffer."      (apply 'make-comint-in-buffer `("Geiser REPL" ,(current-buffer) ,guile nil ,@args))      (geiser-repl--wait-for-prompt 10000)      (geiser-repl--history-setup) -    (geiser-con--setup-connection (current-buffer) geiser-repl--prompt-regex))) +    (geiser-con--setup-connection (current-buffer)  geiser-repl--prompt-regex)))  (defun geiser-repl--process (&optional start)    (or (and (buffer-live-p (geiser-repl--buffer)) @@ -175,7 +175,7 @@ REPL buffer."    (goto-char (point-max))    (comint-kill-region comint-last-input-start (point))    (comint-redirect-cleanup) -  (geiser-con--setup-connection geiser-repl--buffer)) +  (geiser-con--setup-connection geiser-repl--buffer geiser-repl--prompt-regex))  ;;; geiser-repl mode: diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el index e050503..01dd151 100644 --- a/elisp/geiser-syntax.el +++ b/elisp/geiser-syntax.el @@ -83,12 +83,14 @@      (when (not (eq (char-after (point)) ?\())        (skip-syntax-backward "-<>")        (delete-region (point) (point-max))) -    (let ((pps (parse-partial-sexp (point-min) (point)))) -      (when (nth 8 pps) ;; inside a comment or string -        (delete-region (nth 8 pps) (point-max)))) +    (let ((p (nth 8 (syntax-ppss)))) +      (when p ;; inside a comment or string +        (let ((str (nth 3 (syntax-ppss)))) +          (delete-region p (point-max)) +          (when str (insert "XXXpointXXX")))))      (when (cond ((eq (char-after (1- (point))) ?\)) (geiser-syntax--del-sexp -1) t)                  ((eq (char-after (point)) ?\() (delete-region (point) (point-max)) t) -                ((memq (char-after (1- (point))) (list ?. ?@ ?, ?\' ?\` ?\#)) +                ((memq (char-after (1- (point))) (list ?. ?@ ?, ?\' ?\` ?\# ?\\))                   (skip-syntax-backward "^-(")                   (delete-region (point) (point-max))                   t)) @@ -101,7 +103,7 @@  (defsubst geiser-syntax--get-partial-sexp ()    (unless (zerop (nth 0 (syntax-ppss)))      (let* ((end (if (eq (char-after (point)) ?\() (1+ (point)) -                  (save-excursion (skip-syntax-forward "^-()") (point)))) +                  (save-excursion (skip-syntax-forward "^-\"<>()") (point))))             (begin (save-excursion (beginning-of-defun) (point))))        (geiser-syntax--complete-partial-sexp (current-buffer) begin end)))) diff --git a/scheme/guile/geiser/doc.scm b/scheme/guile/geiser/doc.scm index e2fdaca..f446fde 100644 --- a/scheme/guile/geiser/doc.scm +++ b/scheme/guile/geiser/doc.scm @@ -32,6 +32,7 @@    #:use-module (system vm program)    #:use-module (ice-9 session)    #:use-module (ice-9 documentation) +  #:use-module (ice-9 regex)    #:use-module (oop goops)    #:use-module (srfi srfi-1)) @@ -108,6 +109,7 @@     ((procedure-property proc 'arglist) => arglist->args)     ((procedure-source proc) => source->args)     ((program? proc) ((@ (system vm program) program-arguments) proc)) +   ((doc->args (object-documentation proc)))     ((procedure-property proc 'arity) => arity->args)     (else #f))) @@ -139,6 +141,35 @@      (keyword . ,(caddr arglist))      (rest . ,(car (cddddr arglist))))) +(define (doc->args doc) +  (define proc-rx "-- Scheme Procedure: ([^[\n]+)\n") +  (define proc-rx2 "-- Scheme Procedure: ([^[\n]+\\[[^\n]*(\n[\n]+]+)?)") +  (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))))  | 
