Kode apa di Emacs yang membuat `line-number-mode` mencetak" ?? "sebagai nomor baris dalam buffer dengan garis panjang?

21

Saya menggunakan line-number-modeuntuk memiliki indikator dari baris saat ini di modeline saya, namun untuk file besar atau lebih tepatnya, file dengan garis panjang, itu mulai menampilkan dua tanda tanya daripada nomor baris. Saya telah menggali sedikit dan menemukan bahwa ketika line-number-modedidefinisikan simple.el, variabel yang dapat disesuaikan (dan mungkin semua logika yang terlibat) didefinisikan dalam xdisp.c. Mengubah line-number-display-widthvariabel ke angka tinggi yang sewenang-wenang mungkin memperbaikinya, tapi saya jauh lebih tertarik pada potongan kode dan logika yang membuatnya mencetak dua tanda tanya. Akan sangat berguna jika ada di antara Anda yang dapat menemukannya untuk saya, mungkin bahkan menjelaskan logika di baliknya.

wasamasa
sumber
2
Apakah M-: (format-mode-line "%l")menunjukkan tanda tanya juga?
lunaryorn
Ya, itu memberi saya "??" sebagai hasil evaluasi.
wasamasa
1
Nah, kemudian lihat definisi format-mode-line.
lunaryorn

Jawaban:

25

Berkat saran @ lunaryorn saya telah dapat menemukan potongan kode yang menyebabkan ini. Sepertinya pada format-mode-lineakhirnya panggilan decode_mode_specuntuk mengubah kode format yang diberikan menjadi nilai. Untuk kasus %lfungsi ini melakukan beberapa pemeriksaan kewarasan untuk menghindari menghabiskan terlalu banyak waktu menghitung, kemudian memeriksa apakah garis saat ini melebihi line-number-display-limit-width. Karena itu adalah kasus untuk file saya yang dimaksud, ia melompat ke no_valuelabel yang mengembalikan nilai padded ??sebagai.

"Memecahkan" ini melibatkan pengaturan variabel ke nilai yang cukup tinggi:

(setq line-number-display-limit-width 2000000)

Nilai ini diperoleh dengan melihat heuristik yang sesuai di xdisp.cmana mengambil tinggi jendela kali dua ditambah tiga puluh dan mengalikannya line-number-display-limit-width, untuk menghindari meluap most-positive-fixnumpada sistem 32bit, nilai 2000000 akan menjadi taruhan yang aman.

wasamasa
sumber
2
Alih-alih menyimpan dua pertanyaan serupa, bukankah seharusnya pertanyaan lain ditutup sebagai duplikat dan memperbarui jawaban ini?
Kaushal Modi
@kaushalmodi: Selesai!
wasamasa
2
Untuk perubahan sementara:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Eponim
Saya kira ini masuk akal kembali ketika komputer jauh lebih lambat. Saya sudah mengaturnya untuk nilai tinggi dalam file init saya selama beberapa dekade.
Jim Balter