首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从nim调用fzf没有显示fzfs TUI

从nim调用fzf没有显示fzfs TUI
EN

Stack Overflow用户
提问于 2018-08-20 14:24:01
回答 1查看 491关注 0票数 2

我正在尝试将我的一个小python脚本移植到nim。其核心是对fzf的调用:

代码语言:javascript
复制
fzf = subprocess.Popen(["fzf"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = fzf.communicate(some_data)

据我所知,fzf打开/dev/tty与用户进行交互,并使用stdin/stdout与调用它的程序进行通信。腐蚀的尼姆密码:

代码语言:javascript
复制
var p = startProcess(path_to_fzf)
var stream = p.inputStream()
stream.write(some_data)
stream.flush()

但是在我的nim版本中,fzf并没有出现。但输入到终端是读取,因为根据我的输入,正确的项目被选择。

我不知道为什么会这样。我想也许nim用startProcess创建了一个PTY,但是/proc/sys/kernel/pty/nr并没有增加,所以我认为情况并非如此。我试着用-d:useFork编译是因为..。嗯,不知道为什么要修复它,但它没有。据我所知,fzf / and /tty实际上不应该是尼姆可以做的事情,以防止fzf写到/dev/tty。或者python做了一些我不知道的事情,触发fzf来显示它的TUI?

因此,我的问题是如何说服fzf从nim中显示其TUI (以及为什么/如何还没有)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 21:43:24

作为一个正确的答案,我在poParentStreams模块中找到了选项osproc。可以像这样使用它来启动一个TUI:

代码语言:javascript
复制
import osproc

let process = startProcess("htop", options = {poParentStreams, poUsePath})
let eCode = process.waitForExit()
if eCode == 0:
  echo "htop completed successfully"
else:
  echo "htop aborted with error code: " & $eCode

@syntonym在注释中指出,fzf打开/dev/tty是为了在不破坏stdin/stdout流的情况下显示/dev/tty。我不完全确定为什么这在Nim中不起作用,但解决方案当然是将结果写入指定的管道中并从中读出,如下所示:

代码语言:javascript
复制
import osproc
import posix
import streams

discard mkfifo("/tmp/fzfoutput", 0o644)
let process = startProcess("echo \"hello\nworld\" | fzf > /tmp/fzfoutput", options = {poUsePath, poEvalCommand, poParentStreams})
var f: File
discard f.open("/tmp/fzfoutput")
echo "Output of fzf:" & f.readLine()
let eCode = process.waitForExit()
if eCode == 0:
  echo "fzf completed successfully"
else:
  echo "fzf aborted with error code: " & $eCode
discard execCmd("rm /tmp/fzfoutput")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51932881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档