2010-11-23 1 views
3

하나의 버퍼에 eshell의 실행중인 인스턴스가 있고 다른 인스턴스에 C++ 소스를 쓰고 있습니다. 나는 compile<F5>에 묶었으며 출력 파일 (컴파일 중)을 다른 버퍼에서 실행중인 eshell 인스턴스에서 실행할 수 있는지 궁금한가요?Emacs lisp : (lisp을 사용하여) 다른 버퍼에서 작동하는 eshell에서 명령을 실행할 수 있습니까?

그렇지 않다면 새로운 프레임에서 eshell을 열고 자동으로 컴파일 결과를 실행하는 방법이 있을까요?

대단히 감사합니다.

답변

5

일반적으로, 당신이 뭔가를 실행하려면 컴파일이 끝나면 컴파일 명령에 추가합니다. 대신

M-x compile RET make RET 

의 예를 들어, 당신은

M-x compile RET make && ./test RET 

를 입력 할 수 있습니다 또는 경우에 당신이 아마

M-x compile RET make test RET 

을 할 수 있도록, 당신의 메이크에 약간의 적절한 대상에 프로그램을 추가 할 수 있습니다 eshell에서 컴파일 된 프로그램을 실행하고 싶은 이유를 설명 할 수 있으므로 더 나은 조언을 제공 할 수 있습니다. 당신이 eshell 사용을 주장하는 경우


그러나, 당신은 compilation-finish-functions을 사용할 수 있습니다 편집 프로세스가 완료되면

함수를 호출 할 수 있습니다. 각 함수는 컴파일 버퍼와 프로세스 완료 방법을 설명하는 문자열의 두 인수로 호출됩니다.

이 모든 것이 잘 설명되어 있지는 않지만이 프로세스가 성공적으로 완료되면 문자열은 "finished\n"입니다. 그래서 당신은 같은 것을 할 수 있습니다

(defun run-compilation-output-in-eshell (buf msg) 
    "If compilation finished successfully, switch to eshell and execute a command." 
    (when (string= msg "finished\n") 
    (eshell) 
    (goto-char (point-max)) 
    (eshell-kill-input) 
    (insert "echo command goes here") 
    (eshell-send-input))) 

(add-hook 'compilation-finish-functions #'run-compilation-output-in-eshell) 

하지만 이것은 오히려 무례 보인다 컴파일이 완료 될 때 eshell 버퍼에 입력 할 일이 있다면,이 입력을 삭제합니다. 위에서 말한 것처럼 조금 더 많은 컨텍스트가 도움이 될 수 있습니다.

+0

안녕하세요. 답변 주셔서 대단히 감사합니다. 게시물 끝에있는 기능이 트릭을 수행합니다. 지금은 관련성이 없지만 컨텍스트는'g ++ source.cc '로 쉽게 컴파일 할 수있는 C++ (spoj/topcoder)의 간단한 소스 파일을 많이 작성하고 있다는 것입니다. 파일 그래서 나는 그것을 테스트 할 수 있습니다. – zeroDivisible

+0

필자는 이해하지만, 왜 eshell *에서 컴파일 된 프로그램을 실행해야하는지 이해하지 못합니다. 명령 줄을 통해 컴파일 된 프로그램과 상호 작용해야하기 때문입니까? –

+0

나는 집과 직장에서 이맥스에서 일하고있다. 직장에서 나는 내 PC (XP에서 승리)에 대한 권한이 매우 제한되어 있으며 eshell은 내가 얻을 수있는 유닉스 쉘에 가장 가까운 것이다. 게다가 Emacs에있어 키 스트로크가 적고 기본 명령이 거의없는 셸이 필요하기 때문에 충분합니다. 또한 -이 해킹이 어떻게 수행 될 수 있는지 궁금합니다.) – zeroDivisible

2

이맥스이기 때문에 가능한 일이지만 Elisp 해킹이 필요합니다.

한편, 나는 다음과 같은 매크로를 F5에 바인딩하여 쉬운 경로를 제안합니다. 당신이 C에서 F5을 명중 가정 ++ 버퍼 :

  1. 스위치가 eshell하는 버퍼
  2. 은 프로그램 다시 C에
  3. 스위치 ++ 버퍼 컴파일 명령을 실행
관련 문제