1

我正在尝试自定义我的 eshell 来拦截python做两件事:

  1. 如果没有给出参数,则打开一个新窗口并运行 python(例如,$ python
  2. 如果给出了参数,则“按惯例”运行命令(例如,$ 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 中运行我自己的子进程,就像它们默认发生的那样?

4

0 回答 0