2012-04-17 4 views
3

때때로 C-x C-c에서 이맥스 (Emacs)는 "이 이맥스 세션에 클라이언트가 있으며 어쨌든 종료하겠습니까?"라고 발표합니다. "이 이맥스 세션에는 클라이언트가있다."- 어떻게 그 이유를 알 수 있습니까?

는 (. 나는 중요한 경우에, 윈도우 7에서 이맥스 24beta을 사용하고 있습니다)

나는 일부 파일이 emacsclientw.exe를 통해 오픈했다 개폐 될 것으로 예상 -하지만 난 어떤 표시되지 않습니다.

버퍼가 고객이있는 알아낼 수있는 방법이 있나요 (I는 "/c/lang/emacs-24beta/bin/emacsclientw.exe" 자식 설정 --global core.editor이)? (또는 찾을 다른 것이 있습니까?)

답변

7

클라이언트가있는 버퍼를 찾을 수있는 방법이 있습니까?

버퍼가있는 클라이언트의 경우 server-buffer-clients 변수의 값이 0이 아닌 값이됩니다.

나는 더 나은 방법이있을거야하지만,이 코드는 클라이언트와 버퍼의 목록을 제공한다 : 나는 클라이언트 목록에 대한 list-processes을 적응

 
(require 'cl) 

(defvar server-buffers nil) 

(defun show-server-buffers() 
    (interactive) 
    (setq server-buffers nil) 
    (let ((original-buffer (current-buffer))) 
    (loop for buf in (buffer-list) 
     do 
     (progn 
     (switch-to-buffer buf) 
     (if (and 
     server-buffer-clients 
     (buffer-live-p buf)) 
     (add-to-list 'server-buffers buf)))) 
    (switch-to-buffer original-buffer) 
    (message "server-buffers: %s" server-buffers))) 
+0

흥미 롭군요. 커밋을 편집하고 버퍼를 닫으면 server-buffers : (# )라고 표시됩니다. – Falko

+0

Btw : C-C C를 저장 한 다음 버퍼를 종료하는 것보다 더 좋은 방법이 있습니까? – Falko

+0

죽은 버퍼를 제외하고 내 server-buffers 변수를 올바르게 지울 수있는 답을 편집했습니다. –

1

. 새로 정의 된 명령 list-clients을 사용하여 클라이언트 프로세스의 테이블 목록을 얻습니다. 각 클라이언트는 클라이언트가 첫 번째 항목 인 서버 편집 버퍼와 함께 server-buffer-clients에 나열됩니다.

(define-derived-mode client-menu-mode process-menu-mode "Client Menu" 
    "Major mode for listing the currently connected client processes." 
    (remove-hook 'tabulated-list-revert-hook #'list-processes--refresh t) 
    (add-hook 'tabulated-list-revert-hook #'server-list-clients--refresh nil t)) 

(defun server-list-clients (&optional query-only buffer) 
    "Display a list of all clients of this emacs session. 
If optional argument QUERY-ONLY is non-nil, only processes with 
the query-on-exit flag set are listed. 
Any process listed as exited or signaled is actually eliminated 
after the listing is made. 
Optional argument BUFFER specifies a buffer to use, instead of 
\"*Client List*\". 
The return value is always nil." 
    (interactive) 
    (or (fboundp 'process-list) 
     (error "Asynchronous subprocesses are not supported on this system")) 
    (unless (bufferp buffer) 
    (setq buffer (get-buffer-create "*Client Process List*"))) 
    (with-current-buffer buffer 
    (client-menu-mode) 
    (setq process-menu-query-only query-only) 
    (server-list-clients--refresh) 
    (tabulated-list-print)) 
    (display-buffer buffer) 
    nil) 

(defalias #'list-clients #'server-list-clients) 

(defun server-client-buffer (client) 
    "Return buffer with client in `server-buffer-clients'." 
    (catch :found 
    (dolist (buf (buffer-list)) 
     (if (memq client (with-current-buffer buf server-buffer-clients)) 
      (throw :found buf))))) 

(defun server-list-clients--refresh() 
    "Recompute the list of client processes for the Client List buffer. 
Also, delete any process that is exited or signaled." 
    (setq tabulated-list-entries nil) 
    (dolist (p server-clients) 
    (cond ((memq (process-status p) '(exit signal closed)) 
     (delete-process p)) 
     ((or (not process-menu-query-only) 
      (process-query-on-exit-flag p)) 
     (let* ((buf (server-client-buffer p)) 
      (type (process-type p)) 
      (name (process-name p)) 
      (status (symbol-name (process-status p))) 
      (buf-label (if (buffer-live-p buf) 
       `(,(buffer-name buf) 
        face link 
        help-echo ,(format-message 
          "Visit buffer `%s'" 
          (buffer-name buf)) 
        follow-link t 
        process-buffer ,buf 
        action process-menu-visit-buffer) 
        "--")) 
      (tty (or (process-tty-name p) "--")) 
      (cmd 
      (if (memq type '(network serial)) 
       (let ((contact (process-contact p t))) 
      (if (eq type 'network) 
       (format "(%s %s)" 
        (if (plist-get contact :type) 
        "datagram" 
         "network") 
        (if (plist-get contact :server) 
        (format "server on %s" 
         (or 
          (plist-get contact :host) 
          (plist-get contact :local))) 
         (format "connection to %s" 
          (plist-get contact :host)))) 
       (format "(serial port %s%s)" 
        (or (plist-get contact :port) "?") 
        (let ((speed (plist-get contact :speed))) 
        (if speed 
        (format " at %s b/s" speed) 
         ""))))) 
      (mapconcat 'identity (process-command p) " ")))) 
     (push (list p (vector name status buf-label tty cmd)) 
      tabulated-list-entries)))))) 
관련 문제