2017-03-15 4 views
1

내가 환경 모듈 (http://modules.sourceforge.net/를) 처리하는 작은 elisp 코드를 만들어 elisp 코드에서 메이크업 과정 또는 시작 프로세스에서 메시지를 '처리 완료' 성공적으로 버퍼를 cmd를하지만, 다음과 같이 버퍼가 버퍼의 마지막 메시지 '완료 프로세스 모듈'이 있습니다제거하는 방법은 다음과 같이

(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 

을 인해 '모듈이 완료 프로세스'에, (평가 버퍼)는 작동하지 않습니다.

나는 (세트 버퍼 cmd를 버퍼) (시작 - 중 - 버퍼) (삭제 일치 라인 "프로세스")는 (평가 버퍼) 이전

문을 추가했지만 실패했습니다.

내 아이디어는 입니다. 1. 버퍼의 시작 부분에서부터 프로세스 완료 줄 앞에있는 (eval-region)을 사용합니다. 또는 2. 프로세스 완료 라인을 제거하고 (eval-buffer)

감사의 말 :

+0

원하는대로 출력하거나 억제하려면'process-filter'를 사용하는 것이 좋습니다. https://www.gnu.org/software/emacs/manual/html_node/elisp/Filter-Functions.html – lawlist

+0

@ lawlist는 elisp 코딩에 익숙하지 않기 때문에 process-filter를 사용하여 stdout에서 원하지 않는 메시지를 제거하는 방법을 샘플 코드로 보여줄 수 있습니까? – Seong

+0

다음은 'start-process'가 프로세스 버퍼에 대해'nil'을 가지고 버퍼를 생성하지 못하게하는 예에 대한 링크입니다.'process-filter'를 사용하여 원하는 것을 전송합니다 '* Messages * '버퍼에 저장한다. 'process-filter'는 두 개의 인자 - PROCESS와 STRING을 가지고 있습니다. 내가 원했던 것과 원하지 않았던 것을 결정하기 위해, 나는 출력 된 모든 문자열, 예를 들어'(message my output : % s "string)'을 살펴본 다음'string- match '또는'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를 사용합니다. 당신이 eval-buffer를 호출하기 전에 끝날 때까지 기다려야 할 것입니다, 그래서

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

내 경우에는 코드가 완벽하게 작동합니다. 고마워. – Seong

1

make-process는 비동기입니다. 그러나 당신의 즉각적인 문제에 관해서는,이 문자열은 기본 프로세스 센티넬에 의해 간단하게 삽입됩니다.

그러니 그냥

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

또는 단지

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

은 그것을 제거해야한다.

+1

이것은 생명의 은인입니다.'make-process'에': sentinel # 'ignore'를 직접 전달할 수도 있습니다. –

+1

@RadonRosborough : 정말 좋은 점, 정말로 감사합니다. 나는 그것을 내 대답에 덧붙였다. – Stefan

+0

'make-process'를': stderr'과 함께 쓰고 거기에서 메시지를 지우고 싶다면 다음과 같이하십시오 :'(set-process-sentinel (get-buffer-process your-stderr-buffer) # '무시))' –