echo" *"用于在crystal-lang

时间:2018-01-17 23:24:49

标签: crystal-lang

有没有办法回应" *"处理密码时还是其他一些字符?使用STDIN.noecho有效,但没有提供任何用户反馈。 console.cr只提供raw和noecho。

感谢。还在看......

1 个答案:

答案 0 :(得分:2)

您使用STDIN.noecho!走在正确的道路上有效地您需要做的是在原始模式下从STDIN读取,并在每次按下键时回显*。然后你要监听退格键,这样你就可以将光标向后移动一个并用空格替换,然后在用户键入另一个字符时用*替换该空格。您还需要检查终端捕获时被按下的enterControl+C,并以原始模式将所有内容提供给您。

我已经根据用户Alfe在第二条评论中找到{b}实施{b}实现了这一点。 更新:将代码更改为内部块,以有望消除可能的终端问题。

# Fix for crystal bug
STDIN.blocking = true

# STDIN chars without buffering
STDIN.raw do
    # Dont echo out to the terminal
    STDIN.noecho do
        final_password = ""
        while char = STDIN.read_char
            # If we have a backspace
            if char == '\u{7f}'
                # Move the cursor back 1 char
                if final_password != ""
                    STDOUT << "\b \b"
                    STDOUT.flush
                    final_password = final_password[0...-1]
                end
                next
            elsif char == '\r'
                # Enter was pressed we're finished!
                break
            elsif char == '\u{3}'
                # Control + C was pressed. Get outta here
                Process.exit 0
            elsif char.ascii_control?
                # A Control + [] char was pressed. Not valid for a password
                next
            end

            STDOUT << "*"
            STDOUT.flush
            final_password += char
        end

        puts final_password
    end
end

# Resetting when finished
STDIN.blocking = false

如果这对您有所帮助,请务必将其标记为已接听!