在Shell中启动shell命令而不会产生干扰

时间:2014-02-10 22:58:31

标签: emacs elisp eshell

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

  1. 如果没有给出参数(例如$ python
  2. ,打开一个新窗口并运行python
  3. 如果给出参数(例如$ python foobar.py
  4. ,则运行“按常规”命令

    到目前为止,我有类似的东西

    (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.

    的输出中断stdout

    最后,我摆弄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中以与默认情况相同的方式运行我自己的子进程?

0 个答案:

没有答案