Изменить REPL для отображения имени пользователя, имени хоста и текущего рабочего каталога? - PullRequest
0 голосов
/ 23 февраля 2019

В REPL Guile это приглашение scheme@(guile-user)>, но я хочу, чтобы оно показывало my-name@hostname(current-working-directory)>.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 02 марта 2019

IN system / repl / common в дистрибутиве схемы guile вы можете увидеть реализацию repl-prompt:

(define (repl-prompt repl)
  (cond
    ((repl-option-ref repl 'prompt)
     => (lambda (prompt) (prompt repl)))
    (else
      (format #f "~A@~A~A> " (language-name (repl-language repl))
        (module-name (current-module))
        (let ((level (length (cond
                              ((fluid-ref *repl-stack*) => cdr)
                              (else '())))))
          (if (zero? level) "" (format #f " [~a]" level)))))))

Это означает, что у вас есть приглашение repl option ', которое является лямбда

(lambda (repl) ...)

(но это также может быть простая строка) Чем может выводить все, что вы хотите.

У вас есть,

https://www.gnu.org/software/guile/manual/html_node/System-Commands.html#System-Commands

, так что вы можете сделать

scheme@(guile-user)> ,option prompt ">"
>
>(+ 1 2)
$1 = 3
>,option prompt (lambda (repl) ">>")
>>(+ 2 3)
$2 = 5
>>

Но что делать, если вы хотите добавить приглашение в ваш файл .guile?

Если вы поместите их в .guile (до создания приглашения)

(use-modules (system repl common))
(repl-default-option-set! 'prompt ">>>")

вы получите

>>> (+ 1 2)
3

Вы также можете создавать новые реплы, но это для другого вопроса

Для вашего конкретного примера вы можете попробовать

> ,option prompt (lambda (repl) 
                    (format #f "~a@~a(~a)>" 
                            (getenv "USER") 
                            (vector-ref (uname) 1) 
                            (getcwd)))

(но в одной строке) и получите

 stis@lapwine(/home/stis/src/guile/module/system/repl)> (+ 1 2)
 3

Надеюсь, что это поможет.

...