2012-04-17 6 views
3

いつもC-x C-cでEmacsは「このEmacsセッションにはクライアントがありますが、とにかく終了しますか?"このEmacsセッションにはクライアントがあります" - どうすればその理由を知ることができますか?

(。私が重要な場合は、Windows 7でのEmacs 24betaを使用しています)

私はいくつかのファイルがemacsclientw.exe経由で開かれていたこと、オープンであることが予想 - 私はいずれも表示されません。

(私は gitの設定--global core.editor "/c/lang/emacs-24beta/bin/emacsclientw.exe" 持っている)

クライアントを持っているバッファを見つける方法はありますか? (または他に探すべきことがありますか?)

答えて

7

どのバッファにクライアントがあるか調べる方法はありますか?

クライアントにバッファがある場合、その変数のserver-buffer-clientsの値はnil以外の値になります。

は、私は良い方法があります確信しているが、このコードは、クライアントとバッファのリストを与える必要があります:私はクライアントをリストするため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-sを保存してからバッファを終了するより良い方法はありますか?そのようなバッファを閉じるにはC-c C-kですか? – 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)))))) 
関連する問題