2017-03-15 7 views
1

次のようにIは、環境モジュール(http://modules.sourceforge.net/)を扱う小さなelispのコードを作っ成功したバッファに、cmdが、次のようにバッファがメッセージバッファの末尾に「プロセス・モジュールが終了」しました:削除する方法メイクプロセスからのメッセージを「処理を終了」またはelispのコードでプロセスを開始

(setenv "LOADEDMODULES" "gcc/6.2.1") 
(setenv "CXX" "g++") 
(setenv "COMPILER_TYPE" "gcc") 
(setenv "COMPILER_OF_TYPE" "Gcc") 
(setenv "FC" "gfortran") 
(setenv "COMPILER" "gnu") 
(setenv "LOADEDMODULES_modshare" "gcc/6.2.1:1") 
(setenv "FORTRAN_TYPE" "gfortran") 

Process Module finished 

をために動作しません(EVAL-バッファ)、「プロセス・モジュールが終了しました」。

私は(EVAL-バッファ)文の前 (セット・バッファCMD-バッファ) する(beginning-of-buffer) (削除マッチングライン "プロセス")

を追加しましたが、失敗しました。

私の考えは です。1.(eval-region)をバッファの先頭からプロセス終了行の前の行まで使います。 または 2.プロセス終了行を削除して(eval-buffer)を使用します。

ご迷惑をおかけして申し訳ありません。

+0

「プロセスフィルタ」を使用して、必要なものを出力したり抑制したりすることをお勧めします。https://www.gnu.org/software/emacs/manual/html_node/elisp/Filter-Functions.html – lawlist

+0

@私がelispコーディングに慣れていないので、process-filterを使ってstdoutから不要なメッセージを取り除く方法をサンプルコードで教えてください。 – Seong

+0

私の 'start-process'がプロセスバッファのために' nil'を持っている(バッファを作成しないようにする)例へのリンクです。私は 'process-filter'を使って私が望むものを送ります'* Messages * 'バッファに追加します。 'process-filter'にはPROCESSとSTRINGという2つの引数があります。私が望むものとしたくないものを決めるために、まず出力されたすべての文字列( ''(message "my-output:%s" string) ''を見て、 '' string-マッチするか 'string-equal'となります。 http://emacs.stackexchange.com/a/5844/2287また、 'start-process'バッファを検索して置き換えることもできます。 – lawlist

答えて

1

多分何か:また

(defun Modules-module (command) 
    (with-temp-buffer 
    (shell-command 
    (concat "/usr/bin/tclsh /usr/share/Modules/default/libexec/modulecmd.tcl lisp " 
      (shell-quote-argument command)) 
    (current-buffer)) 
    (eval-buffer))) 

、これはあなたの実際の質問の一部ではありませんが、ローカル変数のためのletを使用しています。

(let ((cmd-buffer (get-buffer-create "*modules-cmd*"))) 
    (with-current-buffer cmd-buffer 
    (eq cmd-buffer (current-buffer)))) 
+0

私の場合、あなたのコードは完全に機能します。どうもありがとう。 – Seong

1

make-process非同期ですので、あなたはそれがeval-bufferを呼び出す前に終了するのを待つことをお勧めします。しかし、あなたの直接の問題としては、この文字列は単にデフォルトのプロセスのセンチネルによって挿入されます。

だから

(let ((proc (make-process ...))) 
    (set-process-sentinel proC#'ignore) 
    ...) 

あるいは単に

(make-process ... :sentinel #'ignore) 

はそれを取り除く必要があります。

+1

これは命を救う人です。注意して、 ':sentinel# 'を' make-process'に直接無視することもできます。 –

+1

@RadonRosborough:非常に良い点、確かに、ありがとう。私はそれを私の答えに加えました。 – Stefan

+0

':stderr'で' make-process'を使用し、そこからメッセージを削除したい場合は、これを使います: '(set-process-sentinel(get-buffer-process your-stderr-buffer)# 'ignore ) ' –

関連する問題