1

python次の 2 つのことを行うために、eshell をカスタマイズしてインターセプトしようとしています。

  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プロセスをバックグラウンドに置き、私の出力でstdoutを中断しますeshell-prompt-function.

最後にshell-command、いじりましたが、eshell バッファーに書き込むことができません。特に、

(progn (eshell-trap-errors
        (shell-command (mapconcat (lambda(x) x) cmd-args " ")
                       (get-buffer "*eshell*") (get-buffer "*eshell*"))))

メッセージを表示し、ポイントをeshellText is read onlyバッファの先頭に移動します。

私が探しているものは可能ですか?

編集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

gvr test.pyeshell は入力を python に渡す代わりに実行しようとするため、プロンプトに応答すると eshell での実行に失敗しますが、実行python test.pyは問題なく終了します。

デフォルトで発生するのと同じ方法で、自分のサブプロセスを eshell で実行するにはどうすればよいですか?

4

0 に答える 0