作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 Clojure(例如 vim)中运行交互式 CLI 程序并能够与之交互。
在 bash 和其他编程语言中,我可以用
vim > `tty`
我尝试在 Clojure 中做同样的事情:
(require '[clojure.java.shell :as shell])
(shell/sh "vim > `tty`")
但它只是打开 vim 而没有给我 tty。
背景:我正在开发一个 Clojure CLI 工具,它可以解析电子邮件并让用户在将解析后的数据保存到磁盘之前对其进行编辑。它的工作方式如下:
最佳答案
此代码依赖于 Clojure Java 互操作来使用 Java 的 ProcessBuilder
类。
(defn -main
[]
;use doseq instead of for because for is lazily evaluated
(doseq [i [1 2 3]]
;extract current directory from system variable
(let [file-name (str "test" i ".txt")
working-directory (trim-newline (:out (sh "printenv" "PWD")))]
(spit file-name "")
;this is where fun begins. We use ProcessBuilder to forward commands to terminal
;we pass a list of commands and their arguments to its constructor
(let [process-builder (java.lang.ProcessBuilder. (list "vim" (str working-directory "/" file-name)))
;inherit is a configuration constant
inherit (java.lang.ProcessBuilder$Redirect/INHERIT)]
;we configure input, output and error redirection
(.redirectOutput process-builder inherit)
(.redirectError process-builder inherit)
(.redirectInput process-builder inherit)
;waitFor used to block execution until vim is closed
(.waitFor (.start process-builder))
)
;additional processing here
)
)
;not necessary but script tends to hang for around 30 seconds at end of its execution
;so this command is used to terminate it instantly
(System/exit 0)
)
关于clojure - 如何从 Clojure 中运行交互式 CLI 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541688/
我是一名优秀的程序员,十分优秀!