Cách hiển thị kích thước khung hình đệm / cửa sổ trợ giúp (không phải toàn màn hình)


8

Đôi khi tôi muốn hiển thị thông tin theo kiểu bộ đệm Trợ giúp, vì vậy tôi đã sử dụng mã như thế này:

(with-help-window (help-buffer)
  (princ "Type q to exit this help buffer.\n\n")
  (princ result))

Điều này hoạt động tốt, nhưng cửa sổ trợ giúp chỉ sử dụng một nửa khung hình của tôi. Tôi thường chia khung hình của mình theo chiều ngang, để cho hai cửa sổ cao. Bộ đệm trợ giúp được hiển thị sử dụng một trong hai cửa sổ.

Tôi thà sử dụng toàn bộ khung hình trong một số trường hợp, để hiển thị thêm thông tin và để giảm số lần tôi cần trang xuống thông qua thông tin được hiển thị. Vấn đề cần giải quyết là làm thế nào để sử dụng tạm thời toàn bộ khung cho with-help-windowcuộc gọi và tự động khôi phục bộ đệm / kích thước cửa sổ ban đầu khi tôi nhập "q" trong cửa sổ trợ giúp.

Làm thế nào tôi có thể đạt được mục tiêu này tốt nhất? Tôi nghĩ rằng tôi đang tìm kiếm một cái gì đó như thế này:

(with-FULL-FRAME-help-window (help-buffer)
   ...)

Tôi đã xem chế độ người chiến thắng, dấu trang, lưu bố cục vào sổ đăng ký, các phương thức khác nhau (và mạnh mẽ, nhưng phức tạp) (display-buffer ...). Hầu hết chúng có vẻ hơi ngoài mục tiêu mong muốn của tôi vì chúng có xu hướng sửa / khôi phục bố cục sau thao tác hiển thị toàn khung hình. Và dường như nhiều người trong số họ yêu cầu tôi phải tự khôi phục bố cục cửa sổ của mình (điều mà tôi không muốn làm).

Tôi tự hỏi nếu có ai đã nghe nói về một cách để giải quyết điều này một cách đơn giản. Tôi hy vọng một cái gì đó đơn giản như những cách tiếp cận có thể này, nơi tôi có thể ghi đè lên một cái gì đó bằng khung ...

(let ((help-window-width-display-option fullwidth))
  (with-help-window (help-buffer)
    ...))

Hoặc cách tiếp cận này, mà tôi chưa biết cách thực hiện và có vẻ hơi khó / khó đối với trình độ kỹ năng hiện tại của tôi.

(let ((save original configuration somehow)
  (delete-other-windows)
  (with-help-window (help-buffer)
     ...)
  ;; somehow, when I type "q" in the help buffer
  ;; - catch that action in code after the buffer is killed
  ;; - and restore the original window configuration
  )

Dường như với tôi, vấn đề chính cần giải quyết là làm thế nào để tự động khôi phục cấu hình cửa sổ ban đầu khi tôi gõ "q" trong bộ đệm chế độ trợ giúp tạm thời. Cảm ơn


Một ý tưởng sẽ là sử dụng display-buffer-pop-up-frame: gnu.org/software/emacs/manual/html_node/elisp/. Một ý tưởng ý tưởng khác sẽ là phát hành make-frame trong khi sử dụng display-bufferchức năng tùy chỉnh để nhắm mục tiêu khung mới đó. Nếu bạn quan tâm đến việc định vị và nhắm mục tiêu một khung hiện có, hãy xem ví dụ này: stackoverflow.com/questions/18346785/
Kẻ

Dưới đây là ý tưởng về cách lưu và khôi phục cấu hình cửa sổ của bạn để bạn có thể sử dụng khung hiện có: emacs.stackexchange.com/a/2714/2287 Nếu bạn thấy giống như các cấu hình cửa sổ nhất định, bạn có thể muốn xem xét cài đặt một cái gì đó đó là chi tiết hơn - có một số thư viện liên quan đến việc lưu và chuyển đổi giữa các cấu hình cửa sổ khác nhau.
luật

Như danh sách luật thông thường, cảm ơn sự giúp đỡ của bạn. Tôi đã thử rồi display-buffer-pop-up-frame, vì nó khá gần với những gì tôi tìm kiếm. Nhưng ... khung hình bật lên ở một nơi khác (không phải khung hiện tại của tôi) và tôi phải gửi nó bằng cmd-w, không phải "q" theo kiểu trợ giúp. Lưu / khôi phục cấu hình cửa sổ không phải là vấn đề cơ bản. Hiện tại tôi đang nghiêng về nhân bản và sửa đổi nguồn của cửa sổ trợ giúp để cung cấp cho nó một tùy chọn mà tôi có thể cho phép liên kết hoặc bọc bằng defmacro hoặc thứ gì đó. Tôi mỉm cười khi thấy chúng tôi kén chọn mọi người muốn chính xác những gì chúng tôi muốn từ Emacs.
Kevin

Sau khi đọc nhiều trong help.el, giải pháp dường như được chôn đâu đó trong help-return-method, quit-windowthì quit-restoretham số cửa sổ, và có lẽ một số mã tùy chỉnh để thiết lập / sử dụng tất cả những thứ đó để tạo hiệu ứng mong muốn.
Kevin

Câu trả lời:


5

Ví dụ # 1 : Phím tắt qtrong help-modebộ đệm xuất phát từ special-mode-mapcái được tích hợp vào help-mode-map. Giá trị mặc định là quit-window, chỉ cung cấp bốn (4) hành động có thể: " Theo thông tin được lưu trong quit-restoretham số cửa sổ của WINDOW (1) xóa WINDOW và khung của nó, (2) xóa WINDOW, (3) khôi phục bộ đệm được hiển thị trước đó trong WINDOW hoặc (4) làm cho WINDOW hiển thị một số bộ đệm khác ngoài bộ đệm hiện tại. Nếu không phải là số không, hãy đặt lại quit-restoretham số thành số không. "[Xem doc-string: M-x describe-function RET quit-window RET]

Dưới đây là một phác thảo về những gì ví dụ này làm:

  • Let-ràng buộc biến help-window-selectđể tsao cho *Help*cửa sổ được chọn.

  • Hãy liên kết cấu hình cửa sổ hiện tại với một biến tạm thời được gọi là config.

  • Tạo *Help*cửa sổ.

  • Lưu trữ cấu hình cửa sổ trước - config- trong một biến cục bộ được gọi my-stored-win-config.

  • Tạo một gán khóa cục bộ cho chữ cái q, ràng buộc với my-restore-win-config. [Nhiệm vụ cục bộ này vấp ngã / làm mờ đi nhiệm vụ trước đó quit-window.]

  • Xóa các cửa sổ khác.

  • Nhấn chữ cái qđể khôi phục cấu hình cửa sổ trước và hủy *Help*bộ đệm.

(defvar my-stored-win-config nil)
(make-variable-buffer-local 'my-stored-win-config)

(defun my-restore-win-config ()
  (interactive)
  (when my-stored-win-config
    (set-window-configuration my-stored-win-config)
    (kill-buffer "*Help*")))

Đoạn mã sau đây là một cách sử dụng mẫu, nhưng không phải là một chức năng tương tác hoàn chỉnh. Nó có thể được đánh giá trong *scratch*bộ đệm để xem nó hoạt động.

(let ((help-window-select t)
      (config (current-window-configuration)))
  (with-help-window (help-buffer)
    (princ "Type q to kill this *Help* buffer and restore prior window configuration."))
  (with-current-buffer "*Help*"
    (setq my-stored-win-config config)
    (local-set-key "q" 'my-restore-win-config))
  (delete-other-windows))

Ví dụ # 2 :

Dưới đây là một macro khép kín thực hiện mọi thứ như ví dụ trên, xử lý ba tình huống có thể xảy ra liên quan đến các giá trị hook hiện tại - ví dụ: nilbiểu tượng hoặc danh sách các biểu tượng.

(defmacro help-window-full-frame (buffer-name &rest body)
"Doc-string."
  (declare (indent 1) (debug t))
  `(progn
    (set-marker help-window-point-marker nil)
      (let* (
          (help-window-select t)
          (foo
            (lambda ()
              (set (make-local-variable 'window-configuration)
                (current-window-configuration))
              (local-set-key "q"
                (lambda ()
                  (interactive)
                  (when window-configuration
                    ;; Record the `current-buffer' before it gets buried.
                    (let ((cb (current-buffer)))
                      (set-window-configuration window-configuration)
                      (kill-buffer cb)))))))
          ;; Preserve the original hook values by let-binding them in advance.
          ;; Otherwise, `add-to-list' would alter the global value.
          (temp-buffer-window-setup-hook temp-buffer-window-setup-hook)
          (temp-buffer-window-show-hook temp-buffer-window-show-hook)
          (temp-buffer-window-setup-hook
            (cond
              ((null temp-buffer-window-setup-hook)
                (list 'help-mode-setup foo))
              ((and
                  (not (null temp-buffer-window-setup-hook))
                  (listp temp-buffer-window-setup-hook))
                (add-to-list 'temp-buffer-window-setup-hook foo)
                (add-to-list 'temp-buffer-window-setup-hook 'help-mode-setup))
              ((and
                  (not (null temp-buffer-window-setup-hook))
                  (symbolp temp-buffer-window-setup-hook))
                (list 'help-mode-setup foo temp-buffer-window-setup-hook))))
          (temp-buffer-window-show-hook
            (cond
              ((null temp-buffer-window-show-hook)
                (list 'help-mode-finish 'delete-other-windows))
              ((and
                  (not (null temp-buffer-window-show-hook))
                  (listp temp-buffer-window-show-hook))
                (add-to-list 'temp-buffer-window-show-hook 'delete-other-windows)
                (add-to-list 'temp-buffer-window-show-hook 'help-mode-finish))
              ((and
                  (not (null temp-buffer-window-show-hook))
                  (symbolp temp-buffer-window-show-hook))
                (list
                  'help-mode-finish
                  'delete-other-windows
                  temp-buffer-window-show-hook)))) )
        (with-temp-buffer-window ,buffer-name nil 'help-window-setup (progn ,@body)))))

Và đây là đoạn mã mẫu để đánh giá trong *scratch*bộ đệm.

(help-window-full-frame (help-buffer)
  (princ "Type q to kill this *Help* buffer and restore prior window configuration."))

Wow, cảm ơn bạn cho một câu trả lời tuyệt vời. Tôi đã tiến hành lưu / khôi phục cấu hình cửa sổ và đã tạo một my-help-quithàm, trong khi cố gắng khởi động lại khóa bản đồ trợ giúp bên trong with-help-window. Nhưng nó không hoạt động. Bây giờ tôi thấy bạn liên kết khóa bên trong bộ đệm Trợ giúp (không phải cửa sổ Trợ giúp như tôi đang làm) sau khi bộ đệm được thiết lập. Tôi đoán ràng buộc của tôi đã bị chặn bởi thiết lập bộ đệm. Một bài học kinh nghiệm. Mọi thứ đang hoạt động. Cảm ơn nhiều.
Kevin

Có hai (2) cơ hội để hành động trực tiếp trên *Help*bộ đệm trước khi kết thúc - cơ hội temp-buffer-window-setup-hookchạy help-mode-setupvà sau đó bất cứ điều gì khác đã được / trước đó được gán cho hook; và, sau temp-buffer-window-show-hookđó chạy help-mode-finishvà mọi thứ đã được gán / trước đó cho hook. help-mode-setupnên duy trì đầu tiên trong thời gian, nhưng bạn có thể thêm một cái gì đó đằng sau nó bằng cách ràng buộc một trong những móc nói trên với các công cụ tùy chỉnh. Trong kịch bản đó, bạn sẽ không cần with-current-buffer.
luật

Đã đồng ý. Tôi nhìn cả hai help-mode-setuphelp-mode-finish, nhưng cả hai đều chạy trước khi bộ đệm được hiển thị. Vấn đề chính là chuyển hướng liên kết phím "q" và bạn đã chỉ cho tôi cách thực hiện điều đó trong bộ đệm (không phải cửa sổ mà tôi đang cố gắng thực hiện). Tái bút Tôi đã cố gắng viết một giải pháp như (defmacro with-full-frame-help-window, nhưng macro vẫn yêu cầu một chức năng riêng để xử lý "q" và hành động khôi phục cửa sổ. Tôi sẽ đăng các chức năng hoàn thành của tôi dưới đây.
Kevin

Tôi đã cập nhật câu trả lời với một ví dụ thứ hai sử dụng macro khép kín thực hiện mọi thứ mà ví dụ đầu tiên làm.
luật

1
Điều này cũng hoạt động với tôi, để thay thế tham chiếu bộ đệm " Trợ giúp " được mã hóa cứng vào bộ đệm hiện tại, bởi vì lambda phục hồi là một chức năng cục bộ đệm. ... (kill-buffer (current-buffer)))))). Macro lấy tên bộ đệm làm đối số và giết " Trợ giúp ", do đó có thể có vấn đề nếu người gọi sử dụng bộ đệm có tên khác. Tôi đã sửa đổi macro của mình để xóa buffer-nametham số và tạo / hủy cùng bộ đệm bên trong defmacro.
Kevin

3

Dựa trên câu trả lời xuất sắc của @lawlist, đây là các chức năng đã hoàn thành của tôi cho anh chàng tiếp theo ...

;; a tmp buffer-local place that gets destroyed with the help buffer
(defvar kwj-v-window-config-saved nil)
(make-variable-buffer-local 'kwj-v-window-config-saved)

(defun kwj-help-window-full-frame (string)
  "Show STRING in a help buffer using the full current frame."
  (let (original-layout)
    ;; set this before Help changes the config
    (setq original-layout (current-window-configuration))
    (with-help-window (help-buffer)
      (princ "Type q to exit this help buffer.\n\n")
      (princ string))
    (with-current-buffer "*Help*"
      ;; save layout in buffer local var that gets deleted
      (setq kwj-v-window-config-saved original-layout)
      ;; bind key in BUFFER (not in help window above)
      ;; bind key *after* help buf is displayed
      (local-set-key "q" 'kwj-help-window-restore))
    (delete-other-windows)))

(defun kwj-help-window-restore ()
  "Restore original windows after a full frame help display."
  (interactive)
  (set-window-configuration kwj-v-window-config-saved)
  (kill-buffer "*Help*"))

Chuỗi ý kiến ​​dài ở trên, với sự trợ giúp liên tục từ @lawlist, dẫn đến phiên bản macro này không yêu cầu tên bộ đệm, xử lý chính xác danh sách hook thiết lập / hiển thị ban đầu và điều đó không gây ra vấn đề với "q "Phím trong bộ đệm chế độ Trợ giúp khác .

(defmacro with-help-window-full-frame (&rest body)
  "Display text in a full-frame help window.
Execute BODY forms to put output into the window, with standard
output directed to the buffer."
  ;;tell indenter about this macro name
  (declare (indent 1))
  ;; must use a buffer string name here, not the buffer itself
  `(let ((mybuf ,(buffer-name (get-buffer-create "Full Frame Help")))
         ;;`(let ((mybuf ,(help-buffer))
         mysetup tmpsetup tmpshow)
     ;; save a copy of original hooks
     (setq tmpsetup (copy-list temp-buffer-window-setup-hook))
     (setq tmpshow (copy-list temp-buffer-window-show-hook))

     ;; create window config store and restore functions
     ;; credit to @lawlist on stackoverflow for this embedded setup
     (setq mysetup
           (lambda ()
             ;; store original window configuration
             (set (make-local-variable 'orig-win-config)
                  (current-window-configuration))
             ;; bind q to the window restore function
             (local-set-key
              "q"
              (lambda ()
                (interactive)
                ;; q is shared by all Help-mode buffers
                ;; so guard those that did not set up orig-win-config
                (when (boundp 'orig-win-config)
                  (set-window-configuration orig-win-config))
                (kill-buffer (current-buffer))))))

     ;; Add to help setup hooks. Keep original hook functions if any
     ;; delete-dups destructively hacks our tmp copy, not original hooklists
     (push mysetup tmpsetup)          ;order critical here
     (push 'help-mode-setup tmpsetup) ;this must be first in hook
     (delete-dups tmpsetup)

     (push 'help-mode-finish tmpshow) ;order not important here
     (push 'delete-other-windows tmpshow)
     (delete-dups tmpshow)

     ;; shadow the original hooks with our copies for the display call
     (let ((temp-buffer-window-setup-hook tmpsetup)
           (temp-buffer-window-show-hook tmpshow))

       ;; show buf with locally embedded window restore function
       (with-temp-buffer-window mybuf nil
                                'help-window-setup
                                (progn ,@body)))))

Sử dụng macro theo cách này:

(with-help-window-full-frame
    (princ "Type q to exit this buffer."))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.