Paksa satu font untuk semua mesin terbang unicode

8

Saya menggunakan GNU Emacs 24.4.1 dalam GUI di OS X. Saya ingin memaksa setiap karakter ditampilkan hanya dengan menggunakan satu font daripada membiarkan Emacs memilih yang seharusnya paling sesuai. Saya mengerti bahwa tidak ada font yang akan menyertakan setiap mesin terbang, tetapi saya menggunakan subset unicode terbatas yang banyak font bagus sampaikan dengan memuaskan.

Saya telah melihat banyak pembicaraan tentang penggunaan paket unicode-fonts untuk mengatur font untuk rentang karakter, tetapi saya tidak ingin memiliki seribu baris tambahan dalam konfigurasi saya untuk mengatur setiap blok secara terpisah.

Bagaimana saya bisa menghentikan Emacs dari memetakan mesin terbang yang berbeda secara otomatis ke font yang berbeda?

Terima kasih.

karl
sumber
1
Apakah Anda mencoba di (set-fontset-font t nil MY-FONT)mana MY-FONTnama font Anda?
lunaryorn
@ lunaryorn Terima kasih atas sarannya. Saya mencobanya sekarang dan saya masih mendapatkan font yang berbeda untuk karakter yang berbeda. Saya mencoba mengatur font saya ke Pragmata Pro dan akhirnya mendapatkan mesin terbang unicode Menlo (sebagaimana diverifikasi oleh describe-char).
karl

Jawaban:

6

Bermain dengan definisi font Emacs harus menjadi jawabannya.

Setelah membaca

  • Dokumen font :

    Fontset startup akan menggunakan font yang Anda tentukan, atau varian dengan registri dan enkode yang berbeda, untuk semua karakter yang didukung oleh font itu, dan mundur pada 'fontset-default' untuk karakter lain.

    Jika beberapa karakter muncul di layar sebagai kotak kosong atau kode hex, ini berarti bahwa font yang digunakan untuk mereka tidak memiliki font untuk karakter tersebut.

  • deskripsi set-fontset-font :

    TARGET mungkin kontra; (FROM. TO), di mana FROM dan TO adalah karakter. Dalam hal itu, gunakan FONT-SPEC untuk semua karakter dalam rentang FROM dan TO (inklusif).

    TARGET dapat berupa simbol nama skrip. Jika demikian, gunakan FONT-SPEC untuk semua karakter yang termasuk dalam skrip.

    TARGET mungkin berupa rangkaian karakter. Dalam hal ini, gunakan FONT-SPEC untuk semua karakter di charset.

    TARGET mungkin nihil. Dalam hal ini, gunakan FONT-SPEC untuk karakter apa pun untuk itu tidak ada FONT-SPEC yang ditentukan.

  • dokumen tentang memeriksa rangkaian karakter :

    Ada dua perintah yang dapat digunakan untuk mendapatkan informasi tentang rangkaian karakter. Perintah Mx list-charset-chars meminta nama charset, dan menampilkan semua karakter dalam set karakter tersebut. Perintah Mx menggambarkan-karakter-set meminta nama charset, dan menampilkan informasi tentang charset itu, termasuk representasi internal di dalam Emacs.

    Untuk mengetahui karakter karakter charset mana dalam buffer, beri titik sebelum itu dan ketik Cu Cx =

Dalam file init kami, kami harus dapat menetapkan satu font untuk berbagai karakter:

 (let ((my-font "DejaVu Sans Mono-14"))
  (set-fontset-font "fontset-startup" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-default" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-standard" '(#x000000 . #x3FFFFF) my-font))

Tetapi untuk menetapkan font untuk rentang karakter dan memaksanya sebagai font fallback untuk karakter yang tidak didukung olehnya, kita juga harus menambahkan nil sebagai target:

(let ((my-font "DejaVu Sans Mono-14")
      (font-sets '("fontset-default"
                   "fontset-standard"
                   "fontset-startup")))
  (mapcar
   (lambda (font-set)
     ;; all the characters in that range (which is the full possible range)
     (set-fontset-font font-set '(#x000000 . #x3FFFFF) my-font)

     ;; for all characters without font specification
     ;; in another words it is a setting for lack of fallback font
     ;; if e.g. ℕ called DOUBLE-STRUCK CAPITAL N is not covered by our font
     ;; it will be displayed as placeholder-box,
     ;; because fallback for our font is now... our font :)
     (set-fontset-font font-set nil my-font))
   font-sets))

Sekarang seperti yang dapat kita lihat di bawah titik (kursor) dengan C-u C-x =atau M-x describe-char:

             position: 1430 of 1954 (73%), column: 16
            character: ℕ (displayed as ℕ) (codepoint 8469, #o20425, #x2115)
    preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0x2115
               script: symbol
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong)
             to input: type "C-x 8 RET HEX-CODEPOINT" or "C-x 8 RET NAME"
          buffer code: #xE2 #x84 #x95
            file code: #xE2 #x84 #x95 (encoded by coding system utf-8-unix)
              display: no font available

Character code properties: customize what to show
  name: DOUBLE-STRUCK CAPITAL N
  old-name: DOUBLE-STRUCK N
  general-category: Lu (Letter, Uppercase)
  decomposition: (font 78) (font 'N')

Bagian penting: tampilan: tidak ada font yang tersedia .

Seharusnya dimungkinkan untuk mengaturnya di file .Xresources kami :

Dengan sumber daya X 'Emacs.Font', Anda dapat menentukan nama font seperti nama font yang sebenarnya.

Saya tidak tahu apa itu sintaks yang tepat untuk itu.

Sebelum perubahan itu saya bisa melihat banyak mesin terbang unicode tidak didukung oleh font pilihan saya. Setelah perubahan itu - saya hanya dapat melihat satu font di Emacs saya dan kotak-placeholder kosong untuk mesin terbang yang tidak didukung olehnya.

Ini berfungsi di sistem saya dan harus cukup untuk sekarang sebelum orang lain memberi Anda jawaban yang terperinci, teknis, dan benar .

kmicu
sumber
Penjelasan Anda masuk akal, tetapi konfigurasi saran yang sebenarnya tampaknya tidak berfungsi. Saya tidak dapat mencoba menggunakan pendekatan Xresources karena saya menggunakan Cocoa build Emacs di OS X, tetapi mengatur fontset seperti yang Anda sarankan tampaknya tidak berpengaruh. Jika saya list-fontsetssetelah meletakkan kode Anda di file init saya, saya melihat empat terdaftar dan hanya satu yang terkait dengan font yang saya atur.
karl
1
Saya harus mengklarifikasi: ini tampaknya secara misterius memperbaiki masalah bagi sebagian mesin terbang, tetapi tidak semuanya. Saya mungkin mendapatkan 75% karakter dalam font yang saya inginkan, tetapi masih mundur untuk beberapa orang.
karl
Ya, itu hanya berlaku untuk rentang unicode . Jika Anda ingin lebih banyak penyandian tertutup maka Anda juga harus mengubah fontsets untuk mereka. Saya akan memperbarui jawaban saya, tetapi ini mungkin suatu peretasan. Kita perlu menunggu jawaban dari Tetua Emacs. :)
kmicu
Saya sangat menghargai bantuan sejauh ini dan hampir menandai jawaban Anda sebagai diterima, simpan satu masalah terakhir. Karakter utama yang saya perhatikan adalah bahwa ini tidak berhasil, bahkan setelah modifikasi yang bermanfaat, adalah "modal dua kali lipat" yang digunakan untuk menunjukkan himpunan bilangan alami. Jika saya memeriksanya dengan describe-charitu tampaknya unicode dengan titik kode dalam rentang yang Anda gunakan, tetapi masih menampilkan dengan font yang berbeda.
karl
1
Pembaruan terakhir memberi saya semua yang saya inginkan --- ditandai sebagai terpecahkan. Terima kasih atas bantuan Anda.
karl