2012-04-17 63 views
3

不時地在C-x C-c上Emacs宣佈「這個Emacs會話有客戶端,不管怎麼樣?」。「這個Emacs會話有客戶端」 - 我怎麼知道爲什麼?

(我使用的是在Windows 7中的Emacs 24beta,在重要的情況下。)

我預計一些文件被打開已通過emacsclientw.exe打開 - 但我沒有看到任何。

(我有 混帳配置--global core.editor「/c/lang/emacs-24beta/bin/emacsclientw.exe」)

有沒有辦法找出哪些緩衝器具有客戶端? (或者還有什麼可以查找的?)

回答

7

有什麼方法可以找出哪些緩衝區有客戶端?

當緩衝區有客戶端時,其server-buffer-clients變量的值將不爲零。

我敢肯定有一個更好的辦法,但是這個代碼應該給緩衝區的列表,與客戶:

 
(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 2012-04-17 19:55:50

+0

Btw .:有沒有比保存C-C C-s更好的方法,然後殺死緩衝區C-c C-k來關閉這樣的緩衝區? – Falko 2012-04-17 19:58:08

+0

我編輯了我的答案以排除殺死的緩衝區,並且也正確地清除了我的服務器緩衝區變量。 – 2012-04-17 22:05:10

1

我已經適應list-processes上市的客戶。 您使用新定義的命令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)))))) 
相關問題