Saya terkadang ingin menampilkan informasi dalam gaya buffer Bantuan, jadi saya telah menggunakan kode seperti ini:
(with-help-window (help-buffer)
(princ "Type q to exit this help buffer.\n\n")
(princ result))
Ini berfungsi dengan baik, tetapi jendela bantuan hanya menggunakan setengah dari bingkai saya. Saya biasanya membagi bingkai saya secara horizontal, untuk memberikan dua jendela tinggi. Buffer bantuan yang ditampilkan menggunakan salah satu dari dua jendela.
Saya lebih suka menggunakan seluruh frame dalam beberapa kasus, untuk menampilkan lebih banyak informasi dan untuk mengurangi berapa kali saya perlu menelusuri informasi yang ditampilkan. Masalah yang harus dipecahkan adalah bagaimana untuk sementara waktu menggunakan seluruh frame untuk with-help-window
panggilan, dan untuk secara otomatis mengembalikan buffer / ukuran jendela ketika saya mengetik "q" di jendela bantuan.
Bagaimana cara terbaik untuk mencapai tujuan ini? Saya pikir saya sedang mencari sesuatu seperti ini:
(with-FULL-FRAME-help-window (help-buffer)
...)
Saya telah melihat mode pemenang, bookmark, menyimpan tata letak ke register, berbagai metode (dan kuat, tetapi kompleks) (display-buffer ...)
. Sebagian besar dari mereka tampaknya sedikit tidak sesuai dengan maksud yang saya inginkan karena mereka cenderung untuk memperbaiki / mengembalikan tata letak setelah operasi tampilan bingkai penuh. Dan menurut saya banyak dari mereka mengharuskan saya untuk secara manual mengembalikan tata letak jendela saya (yang saya lebih suka tidak melakukannya).
Saya bertanya-tanya apakah ada yang pernah mendengar cara untuk menyelesaikan ini dengan mudah. Saya berharap sesuatu yang sederhana seperti pendekatan yang mungkin ini, di mana saya dapat menimpa sesuatu dengan bingkai let ...
(let ((help-window-width-display-option fullwidth))
(with-help-window (help-buffer)
...))
Atau pendekatan semacam ini, yang saya belum tahu bagaimana melakukannya, dan yang terlihat agak sulit / rumit untuk tingkat keterampilan saya saat ini.
(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
)
Menurut saya masalah utama yang harus saya selesaikan adalah bagaimana mengembalikan secara otomatis konfigurasi jendela asli ketika saya mengetik "q" di buffer mode bantuan sementara. Terima kasih
display-buffer-pop-up-frame
: gnu.org/software/emacs/manual/html_node/elisp/... Gagasan ide lainnya adalah mengeluarkanmake-frame
sementara menggunakandisplay-buffer
fungsi khusus untuk menargetkan frame baru itu. Jika Anda tertarik untuk mencari dan menargetkan bingkai yang ada, maka lihat contoh ini: stackoverflow.com/questions/18346785/…display-buffer-pop-up-frame
, karena cukup dekat dengan apa yang saya cari. Tapi ... frame muncul di tempat lain (bukan frame saya saat ini), dan saya harus mengirimnya dengan cmd-w, bukan "q" dengan gaya bantuan. Menyimpan / mengembalikan konfigurasi jendela bukanlah masalah yang mendasarinya. Saat ini saya condong ke arah kloning dan memodifikasi sumber dengan-bantuan-jendela untuk memberikan opsi yang saya bisa ikat, atau bungkus dengan defmacro atau sesuatu. Saya tersenyum melihat betapa pemilih kami emacs orang pada keinginan persis apa yang kita inginkan dari Emacs.help-return-method
,quit-window
, yangquit-restore
parameter jendela, dan mungkin beberapa kode kustom untuk set / menggunakan semua hal-hal untuk menciptakan efek yang diinginkan.Jawaban:
Contoh # 1 : Pintasan keyboard
q
dihelp-mode
buffer berasal darispecial-mode-map
yang dimasukkan ke dalamhelp-mode-map
. Nilai defaultnya adalahquit-window
, yang hanya menawarkan empat (4) tindakan yang mungkin: " Menurut informasi yang disimpan dalamquit-restore
parameter jendela WINDOW (1) hapus WINDOW dan bingkainya, (2) hapus WINDOW, (3) pulihkan buffer yang sebelumnya ditampilkan dalam WINDOW , atau (4) membuat WINDOW menampilkan beberapa buffer lain dari yang sekarang. Jika non-nil, atur ulangquit-restore
parameter ke nil. "[Lihat doc-string:M-x describe-function RET quit-window RET
]Berikut adalah garis besar dari apa yang dilakukan contoh ini:
Mari-mengikat variabel
help-window-select
ket
sehingga*Help*
jendela yang dipilih.Biarkan-ikat konfigurasi jendela saat ini ke variabel sementara bernama
config
.Buat
*Help*
jendela.Simpan konfigurasi jendela sebelumnya -
config
- dalam variabel lokal bernamamy-stored-win-config
.Buat tugas kunci lokal untuk surat
q
, yang terikatmy-restore-win-config
. [Tugas lokal ini mengalahkan / membayangi tugas sebelumnya dariquit-window
.]Hapus jendela lain.
Tekan huruf
q
untuk mengembalikan konfigurasi jendela sebelumnya, dan bunuh*Help*
buffer.Cuplikan berikut adalah contoh penggunaan, tetapi bukan fungsi interaktif yang lengkap. Itu dapat dievaluasi dalam
*scratch*
buffer untuk melihatnya beraksi.Contoh # 2 :
Berikut ini adalah makro mandiri yang melakukan semuanya seperti contoh di atas, yang berkaitan dengan tiga situasi yang mungkin berkaitan dengan nilai kait yang ada - misalnya
nil
,, simbol, atau, daftar simbol.Dan di sini adalah cuplikan sampel untuk dievaluasi dalam
*scratch*
buffer.sumber
my-help-quit
fungsi, ketika mencoba untuk memutar kembali kunci peta bantuan di dalamwith-help-window
. Tapi itu tidak berhasil. Saya sekarang melihat Anda mengikat kunci di dalam buffer Bantuan (bukan jendela Bantuan seperti yang saya lakukan) setelah buffer diatur. Saya kira mengikat saya musnah oleh setup buffer. Pelajaran yang bisa dipetik. Semuanya berfungsi sekarang. Terimakasih banyak.*Help*
buffer sebelum selesai -temp-buffer-window-setup-hook
yang berjalanhelp-mode-setup
dan kemudian hal lain yang sudah / sebelumnya ditugaskan ke hook; dan, kemudiantemp-buffer-window-show-hook
yang berjalanhelp-mode-finish
dan apa pun yang sudah / sebelumnya ditugaskan ke hook.help-mode-setup
harus tetap pertama kali, tetapi Anda dapat menambahkan sesuatu di belakangnya dengan mengikat salah satu kait tersebut dengan barang-barang khusus. Dalam skenario itu, Anda tidak perluwith-current-buffer
.help-mode-setup
danhelp-mode-finish
, tetapi mereka berdua berlari sebelum buffer ditampilkan. Masalah utama adalah untuk mengarahkan kembali "q" keybinding, dan Anda menunjukkan kepada saya bagaimana melakukannya di buffer (bukan jendela, yang saya coba lakukan). PS. Saya mencoba menulis solusi sebagai(defmacro with-full-frame-help-window
, tetapi makro masih memerlukan fungsi terpisah untuk menangani "q" dan tindakan restorasi jendela. Saya akan memposting fungsi selesai saya di bawah ini.... (kill-buffer (current-buffer))))))
. Makro mengambil nama penyangga sebagai argumen, dan membunuh " Bantuan ", jadi mungkin ada masalah jika penelepon menggunakan penyangga yang namanya berbeda. Saya memodifikasi makro saya untuk menghapusbuffer-name
parameter, dan menghasilkan / membunuh buffer yang sama di dalam defmacro.Berdasarkan jawaban yang sangat baik dari @lawlist, berikut adalah fungsi saya yang sudah selesai untuk orang berikutnya ...
Rantai panjang komentar di atas, dengan bantuan terus-menerus dari @lawlist, menghasilkan versi makro ini yang tidak memerlukan nama penyangga, memperlakukan dengan benar pengaturan / daftar kait acara yang ditampilkan, dan itu tidak menyebabkan masalah dengan "q " masukkan buffer mode Bantuan lainnya .
Gunakan makro dengan cara ini:
sumber