Buộc một phông chữ duy nhất cho tất cả các glyph unicode


8

Tôi đang sử dụng GNU Emacs 24.4.1 trong GUI trên OS X. Tôi muốn buộc mọi ký tự được hiển thị chỉ bằng một phông chữ thay vì cho phép Emacs chọn một thứ được cho là phù hợp nhất. Tôi hiểu rằng không có phông chữ nào sẽ bao gồm mọi glyph, nhưng tôi sử dụng một tập hợp con giới hạn của unicode mà nhiều phông chữ tốt bao gồm thỏa đáng.

Tôi đã thấy rất nhiều thảo luận về việc sử dụng gói phông chữ unicode để đặt phông chữ cho phạm vi ký tự, nhưng tôi không muốn có thêm một nghìn dòng trong cấu hình của mình để đặt riêng từng khối.

Làm thế nào tôi có thể đơn giản ngăn Emacs tự động ánh xạ các glyph khác nhau sang các phông chữ khác nhau?

Cảm ơn.


1
Bạn đã thử (set-fontset-font t nil MY-FONT)MY-FONTlà tên của phông chữ của bạn?
lunaryorn 23/12/14

@lunaryorn Cảm ơn lời đề nghị. Tôi đã thử điều đó ngay bây giờ và tôi vẫn nhận được các phông chữ khác nhau cho các nhân vật khác nhau. Tôi đã thử cài đặt phông chữ của mình thành Pragmata Pro và cuối cùng nhận được glyphs Menic unicode (như được xác minh bởi describe-char).
karl

Câu trả lời:


6

Chơi với các định nghĩa phông chữ của Emacs nên là câu trả lời.

Sau khi đọc

  • Phông chữ tài liệu :

    Bộ phông chữ khởi động sẽ sử dụng phông chữ mà bạn chỉ định hoặc một biến thể có đăng ký và mã hóa khác nhau, cho tất cả các ký tự được phông chữ đó hỗ trợ và dự phòng 'mặc định phông chữ' cho các ký tự khác.

    Nếu một số ký tự xuất hiện trên màn hình dưới dạng hộp trống hoặc mã hex, điều này có nghĩa là bộ phông chữ được sử dụng cho chúng không có phông chữ cho các ký tự đó.

  • set-fontset-font description:

    MỤC TIÊU có thể là một khuyết điểm; (TỪ. ĐẾN), trong đó TỪ và ĐẾN là các ký tự. Trong trường hợp đó, sử dụng FONT-SPEC cho tất cả các ký tự trong phạm vi TỪ và ĐẾN (bao gồm).

    MỤC TIÊU có thể là một biểu tượng tên tập lệnh. Trong trường hợp đó, sử dụng FONT-SPEC cho tất cả các ký tự thuộc về tập lệnh.

    MỤC TIÊU có thể là một bộ ký tự. Trong trường hợp đó, sử dụng FONT-SPEC cho tất cả các ký tự trong bộ ký tự.

    MỤC TIÊU có thể là con số không. Trong trường hợp đó, sử dụng FONT-SPEC cho bất kỳ ký tự nào mà không có FONT-SPEC được chỉ định.

  • tài liệu về kiểm tra bảng mã :

    Có hai lệnh có thể được sử dụng để lấy thông tin về bảng mã. Lệnh Mx list-charset-chars nhắc nhở cho một tên bộ ký tự và hiển thị tất cả các ký tự trong bộ ký tự đó. Lệnh Mx mô tả-bộ ký tự nhắc nhở cho một tên bộ ký tự và hiển thị thông tin về bộ ký tự đó, bao gồm cả biểu diễn bên trong của nó trong Emacs.

    Để tìm ra ký tự ký tự nào trong bộ đệm thuộc về, đặt điểm trước nó và nhập Cu Cx =

Trong tệp init của chúng tôi, chúng tôi sẽ có thể đặt một phông chữ cho đầy đủ các ký tự:

 (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))

Nhưng để đặt phông chữ cho một phạm vi ký tự và buộc nó là phông chữ dự phòng cho các ký tự không được hỗ trợ, chúng ta cũng phải thêm nil làm mục tiêu:

(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))

Bây giờ như chúng ta có thể thấy dưới điểm (con trỏ) với C-u C-x =hoặc 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')

Phần quan trọng: hiển thị: không có phông chữ .

Có thể đặt nó trong tệp .Xresource của chúng tôi :

Với tài nguyên X 'Emacs.Font', bạn có thể chỉ định tên phông chữ giống như tên phông chữ thực tế.

Tôi không biết thế nào là một cú pháp thích hợp cho điều đó.

Trước sự thay đổi đó, tôi đã có thể thấy rất nhiều glyph unicode không được hỗ trợ bởi phông chữ mà tôi chọn. Sau thay đổi đó - tôi chỉ có thể thấy một phông chữ trong Emacs và hộp giữ chỗ trống cho glyphs không được hỗ trợ bởi nó.

Nó hoạt động trong hệ thống của tôi và bây giờ là đủ trước khi người khác cung cấp cho bạn câu trả lời chi tiết, kỹ thuật và chính xác .


Giải thích của bạn có ý nghĩa tốt, nhưng cấu hình đề xuất thực tế dường như không hoạt động. Tôi không thể thử sử dụng phương pháp Xresource vì tôi đang sử dụng bản dựng Emacs của Cacao trên OS X, nhưng việc đặt phông chữ theo phông chữ như bạn đề xuất dường như không có hiệu quả. Nếu tôi list-fontsetssau khi đặt mã của bạn vào tệp init, tôi thấy bốn danh sách được liệt kê và chỉ có một liên quan đến phông chữ tôi đặt.
karl

1
Tôi nên làm rõ: điều này có vẻ bí ẩn để khắc phục vấn đề cho một khối glyphs, nhưng không phải tất cả chúng. Tôi có thể nhận được 75% các ký tự trong phông chữ tôi muốn, nhưng vẫn là một dự phòng cho một vài lựa chọn.
karl

Có, điều đó chỉ hợp lệ cho ' phạm vi unicode . Nếu bạn muốn mã hóa nhiều hơn thì bạn cũng nên thay đổi phông chữ cho chúng. Tôi sẽ cập nhật câu trả lời của tôi, nhưng đây có lẽ là một số tin tặc. Chúng ta cần chờ câu trả lời từ Elders of Emacs. :)
kmicu

Tôi thực sự đánh giá cao sự giúp đỡ cho đến nay và gần để đánh dấu câu trả lời của bạn là được chấp nhận, lưu một vấn đề cuối cùng. Nhân vật chính tôi luôn nhận thấy rằng điều này không hoạt động, ngay cả sau khi sửa đổi hữu ích, là "vốn hai lần N" được sử dụng để biểu thị tập hợp các số tự nhiên. Nếu tôi kiểm tra nó với describe-charnó dường như là unicode với một điểm mã trong phạm vi bạn đã sử dụng, nhưng nó vẫn hiển thị với một phông chữ khác.
karl

1
Bản cập nhật cuối cùng đó đã cho tôi mọi thứ tôi muốn --- được đánh dấu là đã giải quyết. Cảm ơn bạn đã giúp đỡ.
karl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.