Pertanyaan
Saya ingin membuat antarmuka pengguna dalam bentuk menu popup , menu popup mirip dengan yang digunakan di Magit .
fitur
Definisi Popup
Munculan dalam konteks pertanyaan ini berarti sedikit jendela sementara yang berisi koleksi item menu sehingga pengguna dapat memilih satu dan hanya satu dari item ini.
Posisi di Layar
Munculan diperbolehkan untuk muncul di bagian mana pun dari layar, tetapi diinginkan bahwa itu harus cukup jelas dan karenanya harus muncul di samping jendela yang sedang aktif.
Isi dari Penyangga Popup
Item harus ditampilkan dalam bentuk tabel cantik. Pretty adalah konteks pertanyaan yang berarti menarik secara visual, efek ini dapat paling mudah dicapai dengan meletakkan item menu ke dalam baris lurus, lihat
complete--insert-string
misalnya. Paragraf ini berfungsi untuk klarifikasi tambahan, Anda dapat melakukannya dengan cara Anda sendiri, ini tidak akan membuat jawaban Anda salah.
Pemilihan Item Menu
Pemilihan ini diharapkan dilakukan dengan menekan satu tombol atau, secara opsional dengan mouse (meskipun tidak begitu penting sehingga jawaban yang berisi proposisi yang tidak mendukung mouse adalah legal). Jika Anda mengusulkan solusi yang mendukung mouse, harap perhatikan bahwa pengguna harus dapat memilih item menu dengan cara yang intuitif, yaitu dengan mengklik tombol kiri pada pilihan yang diinginkan.
NB mouse dapat digunakan dalam banyak cara dan cara-cara alternatif untuk menunjukkan pilihan juga disambut.
Eliminasi Popup
Setelah pengguna memilih item menu dengan cara yang dijelaskan di atas, buffer dan dengan demikian jendelanya harus dihilangkan dari pandangan dan juga dimatikan. Jendela yang telah aktif sebelum doa menu popup harus mendapatkan fokus (yaitu, menjadi aktif) lagi.
Nilai dan Argumen yang Dikembalikan
Lebih disukai, konsekuensi tindakan ini harus menghasilkan objek Lisp dikembalikan. Objek Lisp dapat berupa:
nil
- ini menunjukkan bahwa pengguna telah membatalkan menu popup dengan menekan C-gatau dengan cara lain †.string
- string (diizinkan menggunakan simbol) harusstring-equal
ke salah satu string yang disediakan ke menu popup sebagai koleksi item yang sebenarnya.
Cara alternatif untuk memberi tahu seluruh program mengetahui pilihan pengguna, atau, mungkin, ketidakhadirannya, dapat diterima. Namun, jika tidak jelas bagaimana hal itu dapat dilakukan, saya meminta semua penjawab berimprovisasi dan tidak meminta saya untuk klarifikasi lebih lanjut tentang aspek ini.
Ini semua untuk nilai yang dikembalikan. Adapun parameter input, mereka harus setidaknya menyertakan kumpulan string yang mewakili pilihan yang mungkin (yaitu, item menu).
Jawaban yang Dapat Diterima
Jawaban yang diharapkan dapat berupa:
Cuplikan kode yang memadai yang memungkinkan pembaca yang berpendidikan untuk menulis fungsi seperti yang dijelaskan di atas; tidak diharapkan atau perlu untuk menulis seluruh fungsi kerja. Namun, untuk menghindari ketidakpastian (dapatkah sebagian besar kode dihilangkan?), Saya harus mencatat bahwa bagian potongan yang hilang harus dijelaskan dalam komponen jawaban tekstual.
Tautan ke perpustakaan yang ada yang mengimplementasikan fungsi serupa. Untuk menghindari ketidakpastian, saya harus mencatat bahwa serupa dalam kasus kami berarti bahwa perpustakaan dapat digunakan untuk membuat popup (lihat definisi di atas) yang memiliki setidaknya 2 atau 3 fitur yang dijelaskan di atas. Jika perpustakaan yang diusulkan berbeda ke titik di mana kondisi yang dinyatakan sebelumnya tidak dapat dipenuhi, masing-masing kasus tersebut akan dinilai secara independen dan akan selalu dicabut jika OP menganggapnya berguna.
Deskripsi fungsi Emacs bawaan atau yang pihak ketiga yang dapat digunakan untuk mengimplementasikan fitur apa pun yang dijelaskan di bagian «Fitur», lihat di atas. Untuk ketidakpastian menghindari, silakan negara jelas bagaimana jawaban Anda dapat bermanfaat bagi pembaca masa depan yang ingin menerapkan popup , popup menu mirip dengan yang digunakan di Magit .
† Cara-cara alternatif untuk membatalkan menu popup mungkin termasuk yang berikut (tetapi tidak terbatas pada ini):
mengklik di luar jendela menu sembulan;
membunuh buffer yang berisi popup tanpa membuat pilihan.
magit-popup
. Paket baru dipanggiltransient
, dan inilah yang digunakan dalam versi saat inimagit
. Lihat magit.vc/manual/transient untuk dokumentasi.Hydra cukup sederhana untuk ditulis:
Hydra adalah antarmuka keyboard-centric, dan dalam bentuk dasarnya, itu tidak lebih sulit daripada
easy-menu-define
(bawaan). Dan itu cukup dapat diperluas jika Anda ingin membuatnya melakukan hal-hal yang lebih kompleks.Lihat saja antarmuka twitter ini, jendela bagian bawah adalah Hydra khusus, tidak jauh lebih sulit untuk ditulis daripada yang di atas:
Kode untuk ini tersedia di wiki , bersama dengan banyak contoh lainnya.
sumber
Setelah beberapa penelitian saya menemukan idiom yang dapat digunakan untuk membuat jendela di bagian bawah (atau memang di mana saja) dari jendela yang sedang aktif. Ini sendiri memiliki efek jendela tambahan sementara:
Anda dapat bermain sedikit dengan
action
argumenwith-current-buffer-window
jika Anda ingin popup muncul di bagian layar yang berbeda.Fungsi berhenti dijelaskan dalam doc-string
with-current-buffer-window
, ini dapat digunakan untuk mendapatkan input dari pengguna. Seperti yang disarankan @tarsius,read-char-choice
adalah kandidat yang baik untuk bereksperimen.Buffer popup itu sendiri dapat dibuat seperti buffer lainnya. Saya masih memikirkan tombol di sana, karena pengguna dapat menggunakan mouse-nya untuk memilih item di menu popup, bukan hanya keyboard. Namun, ini membutuhkan upaya tambahan jika Anda ingin melakukannya dengan baik.
Jika popup Anda sedikit ad-hoc dan Anda tidak akan membutuhkannya lebih dari sekali, Anda bisa lolos dengan solusi ini. Juga, lihatlah
completion--insert-strings
. Saya menemukan ini cukup berguna sebagai contoh cara menghasilkan cukup banyak item menu, Anda bahkan dapat menggunakannya tanpa diubah jika Anda tidak memerlukan sesuatu yang istimewa.sumber
Berikut adalah solusi pihak ke-3, menggunakan Es .
Kode Anda muncul jendela dengan kandidat diatur dengan rapi sebagai menu. Untuk caranya, lihat di bawah.
Anda mengawali setiap item menu dengan karakter unik. Misalnya, a, b, c ... atau 1, 2, 3 ... Pengguna menekan char untuk memilih item.
Anda mengikat beberapa variabel di sekitar panggilan ke
completing-read
. Anda memberikan daftar item menu Anda. Anda secara opsional menentukan salah satu item sebagai default, dipilih jika pengguna hanya mengklikRET
.Binding variabel kirim
completing-read
ke:Anda dapat membuat item menu semewah yang Anda inginkan (tidak ditampilkan).
mouse-3
menu popup, untuk melakukan apa saja dengan item tersebutAnda juga dapat membuat menu pilihan ganda , yaitu menu tempat pengguna dapat memilih beberapa item sekaligus (pilih subset dari pilihan yang memungkinkan).
sumber
Anda mungkin juga tertarik melihat paket itu
makey
. Ini dimaksudkan untuk menyediakan fungsionalitas yang sama sepertimagit-popup
, dan itu adalah garpu dari pendahulumagit-popup
(magit-key-mode
, disebutkan dalam komentar) sejak saat itu belum paket tersedia secara terpisahmagit
.Izinkan saya juga menyebutkan
discover
: itu adalah contoh cara menggunakanmakey
(dan juga raison d'être). Paket itu dimaksudkan untuk membantu pendatang baru menemukan binding emacs.Referensi
makey
dandiscover
oleh penulisnya.magit-popup
dibuat menjadi paketnya sendiri.sumber
Panduan-Key berfungsi baik bagi saya untuk semua awalan yang dikonfigurasi.
sumber
Berdasarkan jawaban @ Drew (Icicles), dengan modifikasi untuk memisahkan implementasi menu dari data menu - sehingga beberapa menu dapat ditentukan, masing-masing dengan milik mereka sendiri: (konten, prompt, default).
Ini secara opsional menggunakan ivy (bila tersedia), yang memiliki fitur yang lebih canggih seperti dapat mengaktifkan item sambil menjaga menu tetap terbuka.
Popup umum.
Contoh gunakan, tetapkan beberapa tindakan ke tombol f12:
sumber