怎样让 output buffer 接受输入?

正在学习 rust,现在用 SPC m c c 编译项目,然后用 SPC m c x 运行,这时候会弹出一个 output buffer。我的程序需要接受用户输入才会运行,但在 output buffer 里面输入不了东西…

请问我应该怎样做?

在eshell里运行吧

那不就相当于直接在 shell 运行?

对啊,反正实质区别不大。

噢噢,这样。

如果是 shell/sed/awk 脚本,有个 :stdin 头可以传递用户输入:

  • 定义一个块,模拟用户输入的结果

    #+NAME: press_a
    #+BEGIN_SRC sh :results output
    echo a
    #+END_SRC
    
  • 自动填充 stdin

    #+BEGIN_SRC sh :results output :stdin press_a
    read -n 1 -p "Press any key to continue: " key
    echo "You pressed: $key"
    #+END_SRC
    
    #+RESULTS:
    : You pressed: a
    

其它语言虽然暂不支持 :stdin,但还是有些可发挥的空间,以 python 为例:

  • 把源代码 tangle 到文件

    #+BEGIN_SRC python :tangle /tmp/user-input.py3 :eval no
    key = input("Press any key to continue: ")
    print("\nYou pressed: %s" % key)
    #+END_SRC
    
  • 通过 shell 块执行文件,并传递用户输入

    #+BEGIN_SRC sh :results output
    echo a | python3 /tmp/user-input.py3
    # or
    # python3 /tmp/user-input.py3 <<< b
    #+END_SRC
    
    #+RESULTS:
    : Press any key to continue: 
    : You pressed: a
    

    这样就不需要离开 emacs,去 shell 敲命令了。

    前面的源代码快还可以做到自动 tangle,最后只需在 shell 这个块上按 C-c C-c 就可以了,参考:Org-mode 如何自动 tangle 一个代码块?

2 个赞