2012-08-14 2 views
5

제 의도는 각 프롬프트마다 Visible Bookmarks을 사용하고 RET을 누르는 것입니다. 나는 이것을 어느 정도 달성하려고 노력 해왔다. 중요한 문제가 빠져 있다면 아래의 코드에 대해 의견을 말하기 바란다 : eg. args를 기본 함수로 전달하는 것 이상으로 처리해야하는지 잘 모르겠습니다.Emacs eshell. RET를 누를 때 명령 줄의 내용을 읽는 방법

비어있는 명령 줄에서 RET을 누르면 해당 행을 책갈피에 추가하지 않습니다. 어떻게 contol을 기본 함수 eshell-send-input에 전달하기 전에 커맨드 라인 내용을 가로 챌 수 있습니까?

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
(interactive) 
    (bm-bookmark-add) 
    (eshell-send-input use-region queue-p no-newline)) 

(add-hook 'eshell-mode-hook 
      #'(lambda() 
       (define-key eshell-mode-map 
       [return] 
       'eshell-send-input-zAp))) 

답변

4

코드가보기 흉하게 보입니다. eshell-send-input 코드를 읽으면 현재 입력을받는 방법을 알 수 있습니다.

또한 interactive 인수를 읽으십시오. "P"은 사용자 영역을 eshell-send-input으로 전달하는 데 필요합니다.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
    (interactive "*P") 
    (unless (string-equal (eshell-get-old-input use-region) "") 
    (bm-bookmark-add)) 
    (eshell-send-input use-region queue-p no-newline)) 
+0

잘 작동합니다. 안개를 지워 줘서 고마워요. 좋은 도움으로, 점차적으로이 * elisp * 너트를 크랙하고 있습니다 :) –

1

esh-mode는 출력이 출력 될 때마다 갱신 eshell-last-output-end 변수를 정의한다. 그래서, 당신은 (buffer-substring eshell-last-output-end (point-max))과 같은 것을함으로써 껍질로 보내질 문자열을 잡을 수 있습니다.

편집 :. eshel-send-input에 대한 문서에서 인용 :

"입력을 보내기가 eshell - 마지막 출력 종료 후 파싱 및 처리 에 대한 Eshell을받은 보내는 마커의 모든 텍스트를 가리 키도록 입력. 그 마커 전으로,`eshell-얻을 된 입력 ' 된 입력을 검색, 버퍼의 끝까지 복사가 호출하고 전송합니다.

사용 - 지역 이외의 전무 인 경우 , 현재 영역 (점과 마크 사이) 이 입력으로 사용됩니다.

QUEUE-P가 nil이 아닌 경우 입력은 현재 활성화 된 프로세스로 보내지지 않고 다음 프롬프트 인 까지 대기합니다. 프로세스가 없으면 입력이 즉시 처리됩니다.

NO-NEWLINE이 nil이 아닌 경우, 입력은 묵시적 ​​최종 줄 바꿈없이 전송됩니다. "

악센트가 내 것입니다. 그리고 당신은 eshel-send-input의 소스에 보면, 당신은 아이디어를 얻을 수 있습니다 사용 방법에 대한 설명

event_jr의 답변을 반영하려면 - 자체 함수에 그러한 옵션이없는 경우 범용 인수를 반드시 전달할 필요는 없습니다 ... 분명히 지금까지는 그건 불필요한 일입니다.

+0

'eshell-last-output-end'에서 아무 것도 실행할 수 없었습니다. 그 문서는 다음과 같이 말합니다 : * 변수로 문서화되어 있지 않습니다. * –

+0

Mhh ..'esh-mode'와'eshel-'부분은 조금 수수께끼 같았 습니다만, 이름의 * 하이픈이 붙은 각 부분마다 자체적으로 완성 된 것으로 보입니다. . 나는 너무 많은 * bash * 선입견을 가지고있는 것처럼 보입니다. (이제 모든 것을 읽으십시오 ... –

+0

좋은 참고를 위해 고맙습니다. 나는 몇 가지 새로운 점을 배웠습니다. (ond there elisp에서 일반적으로 사용하기에 꽤 많습니다 :) –

0

(Ans 내 자신의 질문을 wering) ... 나는 그 eshell 그 핵심 단지 이맥스 버퍼에 있다는 것을 깨달았습니다. 그래서, 그 점을 염두에두고, 나는 작동하지만, 아마도 더 잘할 수있는이 방법을 생각해 냈습니다. 어쩌면 내가 아직 알지 못하는 부분이있을 수 있으므로 제안을 할 수 있습니다.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "A customized `eshell-send-input`, to add bm-bookmark to prompt line" 
    (interactive) 
    (let ((line (buffer-substring-no-properties (point-at-bol) (point-at-eol)))) 
    (if (string-match eshell-prompt-regexp line) 
     (if (> (length (substring line (match-end 0))) 0) 
      (bm-bookmark-add)))) 
    (eshell-send-input use-region queue-p no-newline))