2012-11-22 8 views
6

로컬 emacs 인스턴스 (aquamacs)를 사용하여 원격 서버에서 R 프로세스를 실행하고 있으며 내 서버에 연결하는 프로세스를 자동화하고 싶습니다. 프로세스는 다음 :이 emacs ESS (ess-remote) 명령을 자동화하는 방법은 무엇입니까?

M-x ess-remote 
r 

가 I이 일반적인 방법을 발견했다 [이맥스] 얻어진 콘솔]

M-x shell 

TERM=xterm 
ssh -Y -C <my remote server> 
screen -rd [and/or] R 

[이맥스]

여기 : http://blog.nguyenvq.com/2010/07/11/using-r-ess-remote-with-screen-in-emacs/. -Y -C 옵션을 사용하면 xterm을 사용하여 플롯을 볼 수 있습니다. 나는 lisp과 tho를 조금씩 봤는데, 실제로 이것을 자동화하는 함수 (예 : .emacs.el)를 정의하는 방법을 함께 모을 수는 없다. 아무도 이런 식으로 아무것도 구현하지 않았습니까?

답변

6

shell을 코드로 호출한다고 가정 해 봅시다. Lisp에서는 모든 것이 괄호로 묶인 접두사 표기법입니다.

(shell) 
가 근접 괄호 다음 줄의 끝으로 포인터를 이동하고 리스프 코드를 실행할 수 <C-x C-e>을 입력

: 그래서 우리는 버퍼에 (예를 들어, 스크래치 버퍼)이 입력합니다. shell 함수가 호출되어야합니다.

자 이제 함수를 함수로 만들자. 다른 함수도 추가 할 수있다. 함수를 작성하는 명령은 defun이며, 다음 함수의 본문 (괄호), 함수의 인수 목록을 이름을 소요하고 : 코드의 끝으로 커서를 이동

(defun automate-connection() 
    (shell)) 
을 , <C-x C-e>을 누르면 기능이 정의됩니다. 이제 우리가 쉘 버퍼에 텍스트를 넣을 필요가

(automate-connection) 

확인을 실행하여 리스프에서 호출 할 수 있습니다.

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm")) 

이제 실행하면 "TERM = xterm"이 쉘 버퍼에 저장됩니다. 그러나 실제로 명령을 보내지는 않습니다. 줄 바꾸기를 시도해 봅시다.

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm\n")) 

이는 개행을 실행하지만 실제로 명령을 실행하지는 않습니다. 왜 안돼? 엔터 키가 무엇을하는지 봅시다. *shell* 버퍼로 이동하여 <C-h c>을 입력 한 다음 Enter 키를 누릅니다. (<C-h c>은 주어진 키를 치면 호출 된 함수의 이름을 인쇄하는 describe-key-briefly을 실행합니다). 그 말은 RET을 눌렀을 때 줄 바꿈을하지는 않지만 실제로는 comint-send-input을 호출하는 것입니다. 그럼 그렇게하자

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

을 지금, 당신은 어떤 리스프 코드에서`(자동화-연결)를 실행하면 전송 주어진 일을 얻어야한다. 다른 명령을 추가하려면 독자에게 연습 문제로 남겨 둡니다.

하지만 잠깐! 우린 정말 끝나지 않았어? 나는 당신이 Lisp 스크래치 버퍼로 이동하고, (automate-connection)을 타이핑하고 그 코드를 평가하고 싶지 않다고 가정한다. 당신은 단지 그것을 타이핑하고 하루 만 부르면됩니다.방금 작성한 함수로는 기본적으로이 작업을 수행 할 수 없습니다. 당신이 원하는대로

(defun automate-connection() 
    (interactive) 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

지금 당신이 그것을 호출 할 수 있습니다, 그것은 텍스트에 넣어 *shell* 버퍼를 열고 말할 것이다 : 당신의 기능에 (interactive)에 호출을 추가 : 다행히도, 그 수 있도록 간단합니다 Emacs가 그 텍스트를 실행하도록 쉘에 지시합니다.

+0

이것은 매우 도움이됩니다. 감사합니다. 지금이 :'(defun는 자동으로 접속을() (대화 형) (쉘) (삽입 "TERM = xterm 등의 \ n SSH -Y -C \ N 스크린 -RD") (COMINT 보내 입력) (RELEASE) 프로세스가 이미 실행되고 있지 않으면'(ess-remote)'가 실행되지 않는 것 같습니다. 나는'(comint-send-input)'과'(ess-remote)'사이에 무엇인가를 할 필요가 있다고 생각한다. – Solomon