在elisp中,交互式地调用eshell命令


#1

我知道eshell-commandeshell-command-result之类的可以运行eshell命令获得输出,前者返回状态,后者返回输出,不过如果我想对命令进行一些输入,比如发送EOF,该怎么办呢?

我看还有一种方法是先开一个eshell buffer,然后执行eshell命令,这样可以通过把输出定向到另一个buffer,来获得输出。不过这样会不会太麻烦了?

elisp的手册里也没有eshell相关函数的手册

==更新==

eshell还可以用管道,可以cat /xxx/xxx | xxx,不过我单独跑可以,但经过.emacs设置打开某类buffer执行这个,管道好像失败了,还是卡住叫我输入。。。


#2

举 个 “栗子”


#3

主贴的那个链接的第一个回答。

不过我的需求和他描述的有三个不同:

第一,我要获得输出;

第二,他假设了emacs已经打开了一个eshell buffer。

第三,我想在命令运行的过程中直接输入字符(可能直接insert?)

我想尽量少开buffer,如果有一个函数就能解决(比如,函数接受一个参数,从这个参数中读取输入,并且输入可以是EOF),那是最好了。

当然我想到了一种开两个buffer解决的情况,主楼说过了,不过我觉得很麻烦。。。不过没有其它很方便的方法的话,那就只有算了。。。


#4

comint-redirect-send-command-to-process 是你需要的吗,从另外一个进程获取输出,比如把其他语言的Repl重定向到其他地方什么的



#5

eshell好像不用comint


#6

你想解决的问题是什么?以及为什么你觉得应该用 Eshell 来解决?


#7

跨平台体验一致


#8

你的这个好像不是很容易就能实现的

输入命令的方式有多种

  1. (+ 89 90) 一个sexp

  2. pwd 或 ls 有对应的 eshell/pwd 或 eshell/ls 命令

  3. emacs 内的命令 可以用M-x 执行的

  4. sqlite3 属于emacs外的命令 需要用process做交互的

前三个都好说 因为他们用的是一个统一的命令做输出 eshell-output-object

你需要设置自己的handles(我没有找到在哪里设置 但可以用硬编码)

最后一种sqlite3和普通的process交互方式是一样的 也是比较麻烦的地方

需要设置process-filter和process-sentinel(如果你以前做过的话会简单些)


#9

为啥我觉得最简单的M-x shell好用呢?

eshell的buffer好像不能编辑