Di Emacs, ada beberapa kasus di mana saya ingin mencegah agar pesan tidak muncul di minibuffer, terutama yang berkaitan dengan "Awal / Akhir buffer" dan "Teks hanya-baca".
Apakah ada cara saya mencegah pesan ini muncul di minibuffer?
Juga, apakah ada beberapa alasan penting mengapa saya tidak ingin menonaktifkan ini? Pada nilai nominal, saya dapat dengan mudah melihat nomor baris dan status tulis buffer pada modeline.
Jawaban:
Di Emacs 25, Anda dapat menekan pesan minibuffer dengan mengikat
inhibit-message
ke nilai nihil:sumber
message1
panggilan fungsi Cmessage3
, yang menghormati variabel ini.(let ((inhibit-message t)) (message make-progress-reporter))
message
mengembalikan string pesan, jadi mungkin Anda melihat string yang dikembalikan saat mengevaluasi kode. Jika Anda mengevaluasi kode ini dalam pengikatan tombol, maka tidak ada pesan yang akan dicetak (kecuali di buffer Pesan ).Anda dapat semacam melakukan ini dari kode Lisp. Kenapa "semacam"? Karena MESSAGE adalah primitif, didefinisikan dalam C, alih-alih fungsi Lisp, dan, sesuai manual referensi Emacs Lisp , panggilan ke primitif dari kode C mengabaikan saran.
Oleh karena itu, untuk benar-benar melakukan pekerjaan yang tepat dalam mengimplementasikan fungsionalitas yang Anda inginkan, Anda perlu mendefinisikan kembali primitif MESSAGE sebagai fungsi Lisp; setelah Anda selesai melakukannya, Anda kemudian dapat menyarankannya dengan kode yang memperoleh string MESSAGE akan bergema ke minibuffer, membandingkannya dengan daftar pesan yang tidak ingin Anda lihat, dan kemudian menelepon atau tidak memanggil MESSAGE tergantung pada hasilnya. Secara teori, ini bisa dicapai dengan misalnya
(defvar *message-prim* (symbol-function 'message))
, dan kemudian(defun message (format &rest args) ... (funcall *message-prim* format args))
- tetapi SIMBOL-FUNGSI memberikan argumen primitif mengembalikan sesuatu yang sebenarnya tidak bisa dipanggil, sehingga FUNCALL memberi sinyal kondisi VOID-FUNGSI.Namun, bahkan jika itu berhasil, itu masih tidak benar-benar melakukan trik, karena mendefinisikan ulang primitif hanya menjamin bahwa redefinisi akan digunakan ketika fungsi dipanggil dari kode Lisp; panggilan dalam kode C masih dapat menggunakan definisi primitif . (Kode C memungkinkan untuk memanggil Emacs Lisp, dan kasus-kasus seperti itu akan melihat redefinisi; tentu saja kode C juga dapat memanggil kode C, dan kasus-kasus seperti itu akan melihat definisi asli.)
Saya agak merenungkan menambal kode C dan mengkompilasi ulang Emacs untuk menyediakan fungsionalitas penindasan pesan yang tepat; Saya tidak benar-benar membutuhkan fungsionalitas itu, tetapi mungkin membuktikan latihan yang menarik, terutama karena saya bukan seorang hacker C. Sementara itu, inilah sesuatu yang saya siapkan, yang ketika dimasukkan ke dalam file, termasuk dari salah satu file init Anda, dan disesuaikan dengan selera Anda, akan menekan pesan yang berasal dari kode Lisp yang persis sama dengan string yang Anda cantumkan untuk penindasan. Selama penindasan diaktifkan, pesan-pesan ini tidak akan pernah muncul di minibuffer; Anda memiliki opsi apakah akan menekan mereka dari
*Messages*
buffer juga.Saya telah menguji ini untuk bekerja dengan pesan yang sebenarnya dihasilkan dari kode Lisp, misalnya keluhan "Anda tidak menentukan fungsi" yang digaungkan oleh DESCRIBE-FUNCTION saat Anda memberikan argumen string kosong. Sayangnya, pesan yang Anda sebut ingin ditekan, seperti "Awal buffer", "End buffer", dan "Teks hanya baca", tampaknya semua berasal dari kode C, yang berarti Anda tidak akan dapat menekan mereka dengan metode ini.
Jika saya pernah berkeliling ke patch sumber, itu (mungkin) akan menentang Emacs 24.3 , dan saya akan memperbarui jawaban ini dengan informasi tentang bagaimana cara menggunakannya.
sumber
Di Emacs 25 dan mungkin di beberapa versi sebelumnya, cara paling bersih untuk melakukan ini adalah sebagai berikut:
Definisi pertama:
Kemudian jika Anda ingin menekan semua pesan yang
some-function
Anda lakukan:Misalnya, saya menekan pesan "Proses Ispell terbunuh" yang dihasilkan oleh fungsi
ispell-kill-ispell
(dalamispell.el.gz
) dengan menulis:Jika Anda perlu mengaktifkan kembali pesan, jalankan:
Beberapa hal yang perlu diperhatikan:
1) Semua pesan yang dihasilkan oleh
some-function
akan ditekan seperti halnya semua pesan yang diproduksi oleh fungsi panggil fungsi panggilan.2) Pesan yang dihasilkan oleh kode C tidak akan ditekan tetapi itu mungkin yang terbaik.
3) Anda harus memastikan
-*- lexical-binding: t -*-
terkandung di baris pertama.el
file Anda .Tetapi bagaimana Anda mengetahui fungsi mana yang dipanggil
message
? Anda dapat membaca kode seperti yang disarankan orang lain, tetapi lebih mudah membiarkan Emacs melakukan pekerjaan untuk Anda.Jika Anda mendefinisikan:
dan kemudian lakukan:
Anda akan mendapatkan jejak balik ditambahkan ke pesan. Dari sini Anda dapat dengan mudah melihat di mana pesan itu dihasilkan.
Anda dapat membalikkan ini dengan:
Pendekatan alternatif adalah memberi saran
message
fungsi dan uji untuk melihat apakah Anda ingin mencetak pesan atau tidak. Ini sederhana jika pesan yang dimaksud adalah string tetap. Misalnya untuk menekan "proses Ispell terbunuh" Anda dapat mendefinisikan:dan kemudian lakukan:
Pendekatan ini segera menjadi sangat berantakan jika pesannya rumit.
sumber
Anda tampaknya meminta cara untuk secara selektif menghambat pesan tertentu . Jawabannya adalah Anda perlu mendefinisikan ulang atau menyarankan kode yang mengeluarkan pesan - pesan khusus itu .
Untuk mencegah semua pesan, misalnya selama durasi beberapa kode, Anda dapat menggunakan
flet
ataucl-flet
untuk mendefinisikan kembali fungsimessage
secara lokal ke (fungsi)ignore
. Atau gunakan teknik yang digunakan dalamedt-electric-helpify
: simpan definisi aslimessage
,fset
untukignore
,fset
mengembalikannya ke def asli (meskipun lebih baik digunakanunwind-protect
jika Anda melakukannya).sumber
grep
atauA
dalam Dired. Cari teks pesan kesalahan dalam file sumber Emacs Lisp (dan mungkin juga dalam file Emacs C, jika Anda memilikinya). HTH.Ini berfungsi untuk menekan "Permulaan buffer" dan "Akhir buffer" dan tidak memerlukan emacs 25.
Terinspirasi oleh https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html tetapi menggunakan "defadvice" untuk kompatibilitas yang lebih baik.
sumber