更改 REPL 以显示用户名、主机名和当前工作目录?

Gar*_*lse 2 scheme gnu guile

在 Guile 的 REPL 中,提示是scheme@(guile-user)>,但我希望它显示my-name@hostname(current-working-directory)>. 有没有办法做到这一点?

Ste*_*fan 5

在 guile 方案分布中的 system/repl/common 中可以看到 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)))))))
Run Code Online (Sandbox Code Playgroud)

这表明您有一个 repl 选项 'prompt,它是一个 lambda

(lambda (repl) ...)
Run Code Online (Sandbox Code Playgroud)

(但它也可以是一个简单的字符串)比可以输出任何你想要的。

你有,

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
>>
Run Code Online (Sandbox Code Playgroud)

但是如果你想在你的 .guile 文件中添加提示怎么办?

如果您将这些放在 .guile 中(在创建提示之前)

(use-modules (system repl common))
(repl-default-option-set! 'prompt ">>>")
Run Code Online (Sandbox Code Playgroud)

你会得到

>>> (+ 1 2)
3
Run Code Online (Sandbox Code Playgroud)

您也可以创建新的回复,但这是另一个问题

对于您的具体示例,您可以尝试

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

(但在一行上)并得到

 stis@lapwine(/home/stis/src/guile/module/system/repl)> (+ 1 2)
 3
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。

  • (基本名称(getcwd)) (2认同)