我正在尝试自定义我的eshell来拦截python
做两件事:
$ python
)$ python foobar.py
)到目前为止,我有类似的东西
(defun eshell/python (&rest cmd-args)
(if (not cmd-args)
(progn (run-python "python")
(select-window (split-window-below))
(switch-to-buffer "*Python*")
(balance-windows)
nil)
(message "Use '*python' to call python directly")))
我尝试用一些不同的东西替换(message ...)
:
根据我尝试的eshell-parse-command "python test.py"
的输出
(progn (eshell-trap-errors
(eshell-named-command "python" cmd-args)))
但它会达到递归限制。
由于*python test.py
做了我想做的事,我接着尝试了
(progn (eshell-trap-errors
(eshell-named-command (concat "*" "python") cmd-args)))
但是这会将python进程置于后台并使用我的eshell-prompt-function.
最后,我摆弄shell-command
,但我无法写入eshell缓冲区。特别是,
(progn (eshell-trap-errors
(shell-command (mapconcat (lambda(x) x) cmd-args " ")
(get-buffer "*eshell*") (get-buffer "*eshell*"))))
给我一条Text is read only
消息并移动指向eshell缓冲区的开头。
我正在寻找什么?
修改1
在未定义eshell/python
的情况下运行,我试图避免别名问题:
(defun eshell/gvr (&rest cmd-args)
(if (not cmd-args)
(progn (run-python "python")
(select-window (split-window-below))
(switch-to-buffer "*Python*")
(balance-windows)
nil)
(progn (eshell-trap-errors
(eshell-named-command "python" cmd-args)))))
如果test.py
是
print "Hello World"
x = raw_input("What should I repeat? ")
print x
当我回复提示时,在eshell中运行gvr test.py
失败,因为eshell尝试执行输入而不是将其交给python,但运行python test.py
没有任何障碍。
如何在eshell中以与默认情况相同的方式运行我自己的子进程?