Tampilkan daftar kata di sepanjang bagian bawah bingkai?

20

Saya ingin menampilkan 3 daftar kata pada baris terpisah secara horizontal di sepanjang bagian bawah (walaupun bagian atas juga berfungsi) dari setiap bingkai emacs yang saya buka. Saya telah memikirkan 6 cara untuk melakukan ini, dan mereka semua memiliki masalah:

  1. Pikiran pertama saya adalah menambahkan baris ke baris mode saya, tetapi AFAICT Anda tidak dapat menggunakan karakter baris baru di baris mode, itu hanya akan dikonversi ke "^ J".

  2. Pikiran kedua saya adalah memiliki garis di bagian atas layar dan menggunakan baris header, tetapi juga tidak mendukung karakter baris baru.

  3. Saya dapat menampilkan overlay pada 3 baris terakhir jendela, tetapi membuat kuat ini tampak sulit - scrolling perlu dipicu ketika titik mencapai overlay daripada akhir sebenarnya dari jendela, dan saya harus terus memposisikan ulang hamparan karena hamparan berada dalam ruang teks bukan ruang jendela.

  4. Saya bisa mencoba membuat jendela khusus di bagian bawah bingkai. Saya telah mencoba mengkodekan ini tetapi tidak terlalu kuat juga, sepertinya tidak berfungsi dengan benar ketika sebuah frame sudah berisi split windows dan saya harus menghidupkan kembali Cx, 1 ke versi custom delete-other-windows yang mengabaikan jendela khusus saya dan saya yakin ada kasus sudut lainnya. Juga ketika jendela bantuan muncul sekarang terbuka muncul secara vertikal karena ia berpikir sudah ada pemisahan horizontal (yang secara teknis ada tetapi itu hanya untuk menampilkan jendela satu baris).

  5. Saya dapat memiliki bingkai khusus untuk ini, tetapi kemudian konfigurasi saya tidak akan berfungsi dalam mode terminal, dan saya harus menulis skrip manajer jendela saya untuk menjaganya agar tetap di bagian bawah layar, membuatnya tidak dapat dipilih, tidak mempengaruhi tata letak, dll. dll

  6. Saya bisa memasukkan teks untuk 3 baris langsung ke minibuffer. Saya mendapatkan ini sebagian berfungsi, saya bisa menumbuhkan minibuffer untuk mengakomodasi 3 baris, dan saya bisa menampilkannya. Namun, setiap kali ada pesan yang bergema, baris-baris tersebut akan hilang sampai saya mengeluarkan perintah lain untuk menampilkannya kembali. Idealnya 3 baris dan area gema tidak akan tumpang tindih sehingga saya bisa melihat keduanya. Ini akan lebih mengganggu jika saya dapat dengan andal menyaring pesan mana yang masuk ke area gema - Saya menemukan solusi pada EmacsWiki tetapi tampaknya tidak berfungsi untuk pesan yang berasal dari sumber C emacs (khusus saya ingin mendapatkan singkirkan pesan penyimpanan file karena saya sering menyimpannya secara otomatis pada waktu).

Untuk konteks, tujuan saya adalah untuk selalu menampilkan kata-kata yang paling sering digunakan dalam buffer saat ini, kata-kata titik terdekat di buffer saat ini, dan kata-kata yang paling baru digunakan dalam buffer saat ini. Saya bermaksud untuk dapat memasukkannya ke buffer melalui perintah suara. Jadi saya bisa mengatakan "2 terdekat" dan minta ia mengambil item kedua dari daftar kata titik terdekat dan menyisipkannya. Saya hanya peduli dengan daftar kata yang terlihat untuk buffer apa pun yang sedang saya edit. Saya tidak ingin menggunakan jendela pop-up yang digunakan oleh berbagai mode penyelesaian kode karena saya perlu daftar selalu terlihat.

Joseph Garvin
sumber
Pertanyaan bagus, dan diajukan dengan baik. Semoga Anda mendapatkan beberapa saran yang bermanfaat.
Drew
Saya bertanya-tanya tentang bagian lain dari # 5, selain kebutuhan terminal-mode (yang utama). Anda dapat menggunakan bingkai khusus yang diposisikan di bagian bawah (tidak ada masalah). Apa yang Anda maksud dengan tidak dipilih , dan mengapa Anda membutuhkannya? Jika maksud Anda hanya baca, maka itu juga tidak masalah. Apa maksud Anda dengan tidak memengaruhi tata letak ? Singkatnya, # 5 tidak terlalu jelas bagi saya.
Drew
@Rew: Maksud saya, saya menggerakkan WM saya menggunakan keyboard, dan sepertinya saya tidak akan pernah ingin memberikan fokus bingkai itu dengan sengaja, jadi saya ingin binding jendela berikutnya / jendela sebelumnya untuk melewatinya. Saya juga ingin tata letak jendela bertindak seolah-olah bingkai itu hanya bagian dari panel / taskbar. Sunting: di mana-mana dalam komentar ini saya katakan 'jendela' Maksudku jendela X, bukan jendela emacs; p
Joseph Garvin
Satu kemungkinan lain yang disarankan kepada saya adalah hanya menggunakan minibuffer. Saya tidak tahu apakah mungkin untuk menampilkan teks secara pasif di sana tanpa mengganggu semua yang mencoba menggunakannya ...
Joseph Garvin
Menambahkan catatan tentang mencoba menggunakan minibuffer.
Joseph Garvin

Jawaban:

8

Dengan banyak eksperimen hacky saya bisa mendapatkan # 6 (menggunakan minibuffer text) ke kondisi kerja yang 'cukup baik'. Berikut screenshotnya:

Tangkapan layar belt dalam aksi

Ada beberapa bagian penting untuk membuat ini bekerja:

  • Memasukkan teks ke dalam minibuffer secara mengejutkan hampir melakukan hal yang benar di luar kotak. Teks yang disisipkan di sana akan benar-benar muncul.
  • Dengan menjadikan teks sebagai 'after-string overlay alih-alih teks biasa, Anda membuatnya tidak dapat dipilih dan tidak perlu khawatir tentang kursor yang sengaja masuk ke dalamnya.
  • Untuk membuat minibuffer prompt perintah berfungsi dengan benar, Anda harus menghambat memasukkan teks / overlay ketika jendela minibuffer aktif.
  • Jika Anda mencoba untuk mengubah ukuran minibuffer dengan fungsi ukuran jendela normal, Anda akan mendapatkan kesalahan tentang windows yang terlalu kecil, jika Anda menggunakan fungsi md-resize-minibuf yang tidak didokumentasikan maka Anda dapat mengubah ukuran ke jumlah baris yang Anda inginkan, selama Anda telah mengatur ukuran-mini-windows ke nol terlebih dahulu.
  • Untuk menyelesaikan daftar yang hilang setiap kali ada pesan Anda harus menyarankan fungsi pesan untuk mencegat pesan. Kemudian Anda memasukkannya ke dalam minibuffer sendiri. Anda juga harus melihat variabel current-message, yang menyimpan apa pun yang terakhir muncul di area echo (secara mengejutkan area echo dan minibuffer secara teknis berbeda dan beberapa fungsi kode sumber C mencetak langsung ke area echo tanpa melalui pesan tersebut. fungsi). Kode yang saya berikan di bawah ini tidak sempurna, pesan bertahan lebih lama daripada biasanya yang harus saya selidiki (memeriksa entri terakhir di * Pesan * mungkin lebih sederhana dan lebih kuat) tetapi ini 'cukup baik' untuk saat ini.

Berikut ini tautan ke implementasi saya dengan sabuk contoh yang menampilkan cincin bunuh. Akhirnya ini akan menjadi bagian dari proyek yang tepat: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

Ini adalah pertama kalinya saya menulis jumlah yang signifikan dari elisp sehingga kualitasnya mungkin di bawah standar, tetapi berfungsi.

Joseph Garvin
sumber
1

Sayangnya, mode-line atau header-line tidak boleh banyak baris. Saya telah menanyakan hal ini sebelumnya dan ada (setidaknya tidak ada) opsi tersembunyi untuk membuat pekerjaan ini. Jadi 1 dan 2 keluar. Saya juga merasa seperti 3 dan 6 adalah hack yang tidak akan membuat Anda bahagia dalam jangka panjang. 3 dan 4 sepertinya pendekatan yang bagus, tetapi untuk membuatnya bekerja dengan andal akan menjadi investasi yang cukup.

Jadi saya akan merekomendasikan bahwa Anda pertama kali membicarakan ini di emacs-devel . Dalam pengalaman saya, beberapa hal dapat diimplementasikan pada akhirnya jika Anda dengan susah payah menjelaskan apa yang Anda inginkan dan mengapa itu adalah hal yang baik. Mungkin butuh waktu, setidaknya sampai rilis berikutnya, tetapi jika Anda baik-baik saja menunggu sedikit atau menggunakan versi pengembangan, maka Anda mungkin bisa mendapatkan apa yang Anda inginkan, dengan usaha yang jauh lebih sedikit.

tarsius
sumber
Terima kasih atas saran untuk menghubungi emacs-devel. Meskipun saya datang dengan solusi itu cukup hacky dan akan menyenangkan untuk memiliki API nyata untuk langsung menggambar di layar koordinat, jadi ketika saya punya waktu saya mungkin akan menembak email dengan cara mereka.
Joseph Garvin