프로세스 출력을 * 메시지 * 버퍼로 전송하지만 에코 영역을 무시하십시오.


9

프로세스 필터에서 *Messages*버퍼 로 출력을 보내고 에코 영역에 메시지 출력이 나타나는 것을 억제 minibuffer-prompt하여 진행중인 서브 프레스 필터 출력에 의해 지워지지 않고 대화 형 명령을 동시에 사용할 수 있습니까?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

편집 (2015 년 1 월 3 일) : 다음은 비슷한 질문에 대한 링크이지만 정확한 문자열이 알려지지 않은 프로세스 문자열에서 작동하도록 만들 수 없었습니다-스레드의 제목은 다음과 같습니다. Emacs -일부 미니 버퍼 메시지 비활성화 :

/superuser/669701/emacs-disable-some-minibuffer-messages


나는 당신이 할 수 있다고 생각하지 않습니다. 왜 다른 버퍼에 로그인하지 않습니까? 이것이 프로세스를 다루는 대부분의 모드가하는 일입니다.
lunaryorn

@lunaryorn-제안 해 주셔서 감사합니다. 전용 버퍼는 문제를 해결하는 유효한 옵션입니다. *Messages*버퍼 로 전송되는 것을 선호하는 몇 가지 프로세스 출력이 있습니다. 동기화 관련 프로젝트 중 하나입니다. 버퍼를 임시로 쓰기 가능 하게 만들고 at를 사용 하는 것과 같이 시도하지 않은 몇 가지 사항 이 있습니다 (내장 솔루션이 있다고 생각하기 때문에 ) . 에코 영역도 오늘 저녁에 다시해볼 게요. . . *Messages*inhibit-read-onlyinsertpoint-max
법률 목록

주목할 점은 메시징을위한 C 기능 이 "에코"및 "로깅"문제로 인해 크게 분리되어 있지만 그 차이점은 사라지지 않는다는 것입니다. 아마도 M-x report-emacs-bug이것을 기능으로 요청할 수 있습니까?
phils

@phils | @lunaryorn : 나는 사용하여 원하는 효과를 얻을 수 있었고 (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))초안 답변을 게시했습니다.이 답변은 사용자 자신의 질문에 대한 필수 대기 기간이 지난 후에 수락 할 수 있습니다. debbugs.gnu.org/cgi/bugreport.cgi?bug=19495report-emacs-bug
lawlist

lawlist : 나는 (그러나 그것은 또한 잘 될 수있다, 나는 실제로 모른다.) 당신이 등 중복 메시지를 처리하기위한 논리의 충돌하여 실행할 수 있기 때문에 그 방법을 제시하지 않을했다 당신은 아마 사용해야 (messages-buffer)버퍼를 얻기 위해 이 방법을 사용하고 (point-max)항상 새 줄의 시작이되는 것은 아닙니다 (예 :) C-g.
phils

답변:


3

minibuffer-message-timeout0 으로 설정하여 미니 버퍼에서 표시를 억제 할 수 있습니다 .

예를 들어, 'mode enabled'메시지에 의해 중단되지 않고 미니 버퍼 프롬프트 (예 : ido find-file)에서 마이너 모드를 토글하려는 몇 곳에서 다음과 같은 것을 사용합니다.

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))

제안 해 주셔서 감사합니다. 그러나 이것은 원하는 효과를 얻지 못했습니다. 또는 (let ((minibuffer-message-timeout 0)) (message "%s" string))대화식 기능을 입력 할 때 에코 영역 / 미니 버퍼에 진행중인 프로세스 출력 인쇄가 계속 표시됩니다. 즉, 프롬프트 및 제안 된 완료가 프로세스 출력 메시지에 의해 지워집니다. execute-extended-commandswitch-to-buffer-other-window
법률 목록

3

첫 번째 초안 초안 (2015 년 1 월 3 일) : 함수 messages-buffer를 사용하여 적절한 버퍼를 찾거나 작성하는 방법 에 관한 @phils의 유용한 의견을 기반으로 초기 초안을 수정 했습니다 messages-buffer-mode. 그리고 point-max줄의 시작 부분에 있는지 확인하십시오 (그렇지 않으면 메시지 문자열을 삽입하기 전에 새 줄을 삽입하십시오).

편집 (2015 년 1 월 4 일) : 삽입 된 문자열이 반드시 새로운 줄로 끝나는 message것은 아니며 함수 가 새로운 줄의 시작 부분에 있는지 확인하지 않는 상황이 있으므로 처리합니다. 이 기능에서. 따라서, message새로운 라인을 삽입 할 때마다 , 상기 라인은 버퍼의 플러시 좌측에서 시작될 것이다.

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))

2

docstring을 살펴보면 원하는 내용으로 전화 한 직후 인수로 message메시지를 nil호출 message하여 원하는 것을 얻을 수 있어야합니다 . docstring에서message

첫 번째 인수가 nil이거나 빈 문자열이면 함수는 기존 메시지를 지 웁니다. 미니 버퍼 내용이 표시됩니다.

따라서 함수를 다음과 같이 수정하면 작동합니다.

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

다음을 수행하여 테스트했습니다.

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

그리고 그것은 작동하는 것 같습니다


제안 해 주셔서 감사합니다. 이 아이디어는 *Messages*버퍼에 실행중인 프로세스 출력으로 테스트 한 다음 대화 형 명령을 호출하면 대화 execute-extended-command형 프롬프트 (예 : M-x부분 완료) 프로세스 출력 (예 : 두 스위치 및 빛의 속도로 나오지만 둘 사이의 깜박임은 식별 할 수 있습니다. 문제가되는 특정 프로세스가 지속적으로 새 메시지를 뱉어 내고 에코 영역에 1 초 동안 새 메시지가 표시되기 때문입니다.
법률 목록
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.