ヘルプバッファー/ウィンドウのフルフレームサイズ(全画面ではない)を表示する方法


8

ヘルプバッファスタイルで情報を表示したい場合があるため、次のようなコードを使用しています。

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

これは正常に機能しますが、ヘルプウィンドウはフレームの半分しか使用しません。私は通常、フレームを水平に分割して、2つの高い窓を作ります。表示されるヘルプバッファーは、2つのウィンドウのいずれかを使用します。

場合によっては、フレーム全体を使用して、より多くの情報を表示し、表示された情報をページ送りする必要がある回数を減らします。解決する問題は、with-help-window呼び出しにフレーム全体を一時的に使用する方法と、ヘルプウィンドウで「q」を入力したときに、元のバッファー/ウィンドウサイズを自動的に復元する方法です。

この目標を達成するにはどうすればよいですか?私はこのようなものを探していると思います:

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

私は、勝者モード、ブックマーク、レイアウトをレジスターに保存すること、さまざまな(そして強力ですが複雑な)(display-buffer ...)メソッドを見てきました。それらのほとんどは、フルフレームの表示操作後にレイアウトを修正/復元する傾向があるため、私の意図する意図から少しずれているように見えます。そして、それらの多くは手動でウィンドウレイアウトを復元する必要があるように思えます(私はこれを行いたくありません)。

誰かがこれを簡単に解決する方法を聞いたのではないかと思います。私はこれらの可能なアプローチのような単純な何かを望んでいます、そこで私は何かをletフレームで上書きすることができます...

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

または、この方法はまだ方法がわからないので、現在のスキルレベルではやや難しい/トリッキーに見えます。

(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
  )

一時的なヘルプモードバッファに「q」と入力したときに、元のウィンドウ構成を自動的に復元する方法が、解決すべき重要な問題のようです。ありがとう


1つのアイデアは、gnu.orgdisplay-buffer-pop-up-frame / software / emacs / manual / html_node / elisp / を使用することです 別のアイデアは、新しいフレームをターゲットにするカスタム関数を使用してmake-frame しばらく発行するdisplay-bufferことです。あなたが見つけると、既存の枠をターゲットに興味を持っている場合、この例を見てみましょう: stackoverflow.com/questions/18346785/...
lawlist

既存のフレームを使用できるように、ウィンドウ構成を保存および復元する方法のアイデアは次の とおり です。それはより複雑です-さまざまなウィンドウ構成の保存と切り替えを処理するライブラリがいくつかあります。
法律家、2016年

いつもの法律家のように、どうぞよろしくお願いします。display-buffer-pop-up-frame探しているものにかなり近いので、私はすでに試しました。しかし...フレームが別の場所(現在のフレームではない)にポップアップし、ヘルプスタイルの "q"ではなく、cmd-wでそれをディスパッチする必要があります。ウィンドウ構成の保存/復元は根本的な問題ではありません。現在私はwith-help-windowのソースを複製して変更することに傾倒しており、バインドするか、defmacroなどでラップできるオプションを提供しています。私は、人々が私たちがEmacsに正確に欲しいものを望んでいるのをいかにうるさくするかを微笑んでいます。
Kevin

help.elで詳細を読んだ後、ソリューションはウィンドウパラメータの、、およびおそらくカスタムコードでどこかに埋め込まれているようでhelp-return-method、これらすべてを設定/使用して目的の効果を作成します。quit-windowquit-restore
ケビン

回答:


5

例1:バッファのキーボードショートカットqは、に組み込まれているhelp-modeからのspecial-mode-mapものですhelp-mode-map。デフォルト値はでquit-window、次の4つのアクションのみを提供します:「WINDOWのquit-restoreウィンドウパラメータに格納された情報に従って、(1)WINDOWとそのフレームを削除する、(2)WINDOWを削除する、(3)以前にWINDOWに表示されたバッファを復元する、または(4)WINDOWに現在のバッファー以外のバッファーを表示させquit-restoreます。nil以外の場合は、パラメーターをnil にリセットします。 "[doc-string:を参照 M-x describe-function RET quit-window RET]

この例の概要は次のとおりです。

  • 変数help-window-selectをにバインドしtて、*Help*ウィンドウが選択されるようにします。

  • 現在のウィンドウ構成を、という一時変数にバインドしますconfig

  • *Help*ウィンドウを生成します。

  • 以前のウィンドウ構成を- configというローカル変数に保存しますmy-stored-win-config

  • qバインドされている文字のローカルキー割り当てを作成しますmy-restore-win-config。[このローカル割り当ては、の以前の割り当てよりも優先されます/影を落としquit-windowます。]

  • 他のウィンドウを削除します。

  • 文字qを押して前のウィンドウ構成を復元し、*Help*バッファを強制終了します。

(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*")))

次のスニペットは使用例ですが、完全なインタラクティブ機能ではありません。*scratch*バッファで評価して、動作を確認できます。

(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))

例2

上記の例のようにすべてを行う自己完結型マクロは次のとおりです。これは、既存のフック値に関連する3つの可能な状況(例:nil、シンボル、またはシンボルのリスト)を処理します。

(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)))))

*scratch*バッファで評価するサンプルスニペットを次に示します。

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

すばらしい答えをありがとうございます。ウィンドウ構成の保存/復元に進み、my-help-quit関数を作成しましたが、内部でヘルプマップキーを再バインドしようとしましたwith-help-window。しかし、それは機能していませんでした。バッファを設定した後、ヘルプ バッファ内にキーをバインドしているのがわかります(私が行っていたようなヘルプウィンドウではありません)。私のバインディングは、バッファのセットアップによって破壊されたと思います。学んだ教訓。すべてが現在機能しています。どうもありがとう。
ケビン

*Help*バッファが完了する前にバッファに直接作用する2つの機会があります。temp-buffer-window-setup-hookそれは実行されhelp-mode-setup、次にフックにすでに/以前に割り当てられた他のものが実行されます。そして、temp-buffer-window-show-hookwhichが実行help-mode-finishされ、フックに既に/以前に割り当てられたものすべて。 help-mode-setup最初に残るはずですが、前述のフックのいずれかをカスタムのものにバインドすることで、その後ろに何かを追加できます。そのシナリオでは、必要ありませんwith-current-buffer
法律家、2016年

同意した。との両方help-mode-setupを確認help-mode-finishしましたが、どちらもバッファが表示される前に実行されました。重要な問題は "q"キーバインドをリダイレクトすることでした、そしてあなたはそれをバッファで(私がやろうとしていたウィンドウではなく)それを行う方法を私に示しました。PS。ソリューションをとして記述しようとしました(defmacro with-full-frame-help-windowが、マクロはまだ「q」とウィンドウ復元アクションを処理するために別の関数を必要とします。完成した機能を以下に掲載します。
ケビン

最初の例と同じことをすべて行う自己完結型マクロを使用する2番目の例で答えを更新しました。
法律家、2016年

1
これは、ハードコーディングされた「Help」バッファー参照を現在のバッファーに置き換えるためにも機能します。復元ラムダはバッファーローカル関数であるためです。... (kill-buffer (current-buffer))))))。マクロは引数としてbuffer-nameを取り、「Help」を強制終了したため、呼び出し元が名前の異なるバッファーを使用した場合、問題が発生する可能性があります。マクロを変更してbuffer-nameパラメーターを削除し、defmacro内で同じバッファーを生成/強制終了しました。
Kevin

3

@lawlistによる優れた答えに基づいて、次の人のための私の完成した機能はここにあります...

;; 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*"))

上記のコメントの長いチェーンと@lawlistからの継続的な支援により、このバージョンのマクロはバッファー名を必要とせず、元のセットアップ/表示フックリストを適切に処理し、「q "他のヘルプモードバッファを入力します。

(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)))))

この方法でマクロを使用します。

(with-help-window-full-frame
    (princ "Type q to exit this buffer."))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.