Terminal 我如何在Clojure中读取STDIN中的单个字符?

Terminal 我如何在Clojure中读取STDIN中的单个字符?,terminal,clojure,console,stdin,tty,Terminal,Clojure,Console,Stdin,Tty,我正在写一个循环,它只对单字符输入有效。根据用户按下的键(不按ENTER键),我想显示用户键入的键,然后重复。如果用户按下“q”,则循环必须退出 限制条件: 我不关心Unicode(只支持我们ASCII字符集是可取的) 我只关心Unixy系统(只有Linux可以) 我用的是莱宁根 这能做到吗?通过搜索,我找到了jline2,它有ConsoleReader类,但似乎在jline3中消失了。我看到并使用链接的重复答案,得出了以下结论: ; Need `(:import [org.jline.te

我正在写一个循环,它只对单字符输入有效。根据用户按下的键(不按ENTER键),我想显示用户键入的键,然后重复。如果用户按下“q”,则循环必须退出

限制条件:

  • 我不关心Unicode(只支持我们ASCII字符集是可取的)
  • 我只关心Unixy系统(只有Linux可以)
  • 我用的是莱宁根
这能做到吗?通过搜索,我找到了jline2,它有ConsoleReader类,但似乎在jline3中消失了。

我看到并使用链接的重复答案,得出了以下结论:

; Need `(:import [org.jline.terminal TerminalBuilder Terminal])`

(defn new-terminal
  "creates new JLine3 Terminal.
  returns terminal object"
  ^Terminal [term-name]
  (let [terminal (-> (TerminalBuilder/builder)
                     (.jna true)
                     (.system true)
                     (.name term-name)
                     (.build))]
    terminal))

(defn interactive-loop []
  (let [t (new-terminal "xxx")]
    (.enterRawMode t)
    (let [reader (.reader t)]
    (loop [char-int (.read reader)]
      (case (char char-int)
        \q (do
          (println "Bye!")
          (.close reader)
          (.close t))
        (do (println (char char-int))
            (recur (.read reader))))))))
我使用的是NixOS,显然jline3库依赖于安装的
infocmp
二进制文件,这是流行的
ncurses
包的一部分。不幸的是,我目前使用的Nixpkgs版本没有打包这个二进制文件,所以我在这里放了一个PR:

我看到并使用链接的重复答案,得出了以下结论:

; Need `(:import [org.jline.terminal TerminalBuilder Terminal])`

(defn new-terminal
  "creates new JLine3 Terminal.
  returns terminal object"
  ^Terminal [term-name]
  (let [terminal (-> (TerminalBuilder/builder)
                     (.jna true)
                     (.system true)
                     (.name term-name)
                     (.build))]
    terminal))

(defn interactive-loop []
  (let [t (new-terminal "xxx")]
    (.enterRawMode t)
    (let [reader (.reader t)]
    (loop [char-int (.read reader)]
      (case (char char-int)
        \q (do
          (println "Bye!")
          (.close reader)
          (.close t))
        (do (println (char char-int))
            (recur (.read reader))))))))

我使用的是NixOS,显然jline3库依赖于安装的
infocmp
二进制文件,这是流行的
ncurses
包的一部分。不幸的是,我目前使用的Nixpkgs版本没有打包这个二进制文件,所以我在这里放了一个PR:

Clojure问题,但我认为Java答案在这里是适用的。可能是重复的,非常感谢。我会用Clojure MWE更新另一个问题,然后点击“解决了我的问题!”按钮,如果可以的话?我认为不应该修改另一个问题。如果它回答了你的问题,是的,你可以接受重复的建议。我在这里发布了一个答案,在Clojure中为我解决了这个问题。这可能会帮助其他法学家。另一个问题确实有点帮助,但我仍然需要根据另一个要点对问题进行一些调整。鉴于此,这个问题和答案可能具有足够的独创性,可以保持原样。我对我的解决方案很满意,所以可以随意调节。Shugclojure的问题,但我认为Java的答案在这里是适用的。可能是重复的,非常感谢。我会用Clojure MWE更新另一个问题,然后点击“解决了我的问题!”按钮,如果可以的话?我认为不应该修改另一个问题。如果它回答了你的问题,是的,你可以接受重复的建议。我在这里发布了一个答案,在Clojure中为我解决了这个问题。这可能会帮助其他法学家。另一个问题确实有点帮助,但我仍然需要根据另一个要点对问题进行一些调整。鉴于此,这个问题和答案可能具有足够的独创性,可以保持原样。我对我的解决方案很满意,所以可以随意调节。耸肩