gpt4 book ai didi

emacs - 如何在 Common Lisp 中隐藏(读取)输出

转载 作者:行者123 更新时间:2023-12-01 13:32:57 25 4
gpt4 key购买 nike

我正在写一个密码输入函数,我想让它像 Unix/Linux 密码输入风格,输入但不在屏幕上打印任何东西。或者,在屏幕上打印“*”也可以。

我发现了这个问题“common lisp, how to mask keyboard input”,这正是我想要的,但是给定echo-onecho-off 的函数回答让我感到 panic ,当我在我的粘液中运行它们。 (但是,他们通过了编译)。

我在 emacs/slime 中编写代码,而 panic 发生在 slime 中(下面的错误消息)。在我的计划中,我将通过 sbcl --load ./this-script.lisp 在终端中运行这个脚本。

错误信息是:

#<TWO-WAY-STREAM
:INPUT-STREAM #<SB-SYS:FD-STREAM for "standard input" {1004AA8933}>
:OUTPUT-STREAM #<SB-SYS:FD-STREAM for "standard output" {1004AA8A63}>>
fell through ETYPECASE expression.
Wanted one of (FILE-STREAM FIXNUM).
[Condition of type SB-KERNEL:CASE-FAILURE]

现在有人知道怎么做吗?

谢谢。

sbcl 版本:SBCL 2.0.0macOS:10.15.2

最佳答案

如果你直接从 emacs 运行 slime(即使 emacs 是用 -nw 启动的),没有终端可以用 termios 控制。 .在这种情况下,sb-sys:*tty* 绑定(bind)到既不是 file-stream 也不是 fixnum 的双向流。这就是代码失败的原因。

如果您的代码应该能够在不同的用户界面(实际的 emacs GUI、GTK 等)中运行,那么您需要管理前端和专用方式来提示输入密码(例如 emacs 有一个 read-passwd 函数,但是你必须从 sbcl 调用 emacs 代码,默认情况下这是被禁止的;并且密码应该在 emacs 和 sbcl 之间的传输过程中被加密);这需要更多的工作,而且没有简单的答案。

如果您只想编写一个应该只在终端中运行的应用程序,但在开发过程中您想使用 Slime 从 emacs 进行编码,那么您只需更改启动 Slime 的方式即可:

  • 从终端启动 sbcl
  • 运行 swank 服务器

    (ql:quickload :swank)
    (swank:create-server)
  • 在 emacs 中,使用 slime-connect 连接到该服务器

然后,sb-sys:*tty* 将指定终端,代码应该按预期工作。在所有情况下(开发和实际使用)运行相同的代码。

关于emacs - 如何在 Common Lisp 中隐藏(读取)输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com