python
次の 2 つのことを行うために、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プロセスをバックグラウンドに置き、私の出力で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.py
eshell は入力を python に渡す代わりに実行しようとするため、プロンプトに応答すると eshell での実行に失敗しますが、実行python test.py
は問題なく終了します。
デフォルトで発生するのと同じ方法で、自分のサブプロセスを eshell で実行するにはどうすればよいですか?