0

次のようなemacs関数を書きたい-

1)「abc」という名前の新しいシェルを開始します。2)ディレクトリ「/ opt / abc」を変更します。3)ディレクトリでシェルコマンド「pythonabc.py」を実行します。

私は次の関数を書きました-

(defun abc-server ()
 (interactive)
 (shell-command "cd /opt/abc/")
 (shell-command "python abc.py"))

上記の問題-

1)新しいシェルを開始しません。2)ディレクトリを変更しません。3)cmdを実行すると、ブラウザウィンドウが開き、emacsの使用が完全にブロックされます。

4

2 に答える 2

1

shell-commandのdocstring( )からC-h f shell-command

COMMANDがアンパサンドで終わる場合は、非同期で実行します。出力はバッファ`非同期シェルコマンド'に表示されます。そのバッファはシェルモードです。

また、すべてを1つのコマンドラインに結合します。 shell-command毎回新しいシェルを作成するため、pwdはある呼び出しから別の呼び出しまで持続しません。

(defun abc-server ()
 (interactive)
 (shell-command "cd /opt/abc/; python abc.py &"))
于 2012-07-09T15:12:38.003 に答える
0

@jpkottaの答えは十分に良いですが、適切な解決策はEmacsのanyncプリミティブを使用するでしょう。一つには、一度に実行できる非同期シェルコマンドは1つだけですが、名前付きサブプロセスは多数持つことができます。

(defun abc-server ()
  (interactive)
  ;; Create buffer ahead of time so we can change its default directory
  (save-excursion
    (get-buffer-create "*abc-server*")
    (cd "/opt/abc") )
  (start-process "abc" "*abc-server*" "python" "abc.py") )

(フープに完全に満足しているわけではありませんsave-excursion。単純にバインドできることを望んdefault-directoryでいましたが、期待どおりに機能しなかったようです。または、可能(start-process "abc" "*abc-server*" "sh" "-c" "cd /opt/abc; python abc.py")です。)

コマンドをさらに拡張する必要がある場合、これは迅速でダーティな非同期シェルコマンドアプローチよりもスケーラブルなプラットフォームであると私は主張しますが、これが必要なすべてである場合、それはそれほど重要ではありません。

于 2013-11-27T08:52:56.003 に答える