2009-02-10 23 views
31

Làm cách nào để thay đổi khuôn mặt mặc định mà Emacs sử dụng cho văn bản kiểu trên cơ sở cho mỗi chế độ?Đặt Emacs defaut font face per-buffer/mode

Ví dụ: giả sử rằng tôi đã hài lòng với các tùy chỉnh khuôn mặt mà tôi có, bao gồm phông chữ cố định chiều rộng cố định. Tuy nhiên, trong một chế độ cụ thể (markdown-mode.el, nói), tôi muốn phông chữ mặc định có chiều rộng thay đổi. Bạn có thể dễ dàng tạo kiểu đầu trang, liên kết, v.v. duy nhất cho chế độ đánh dấu: chỉ cần đặt con trỏ lên văn bản được tạo kiểu và M-x describe-face, sau đó nhấp vào liên kết để tùy chỉnh nó.

Tuy nhiên, mặt mặc định là khuôn mặt được sử dụng nếu không có khuôn mặt nào khác được chỉ định, vì vậy nó không dành riêng cho chế độ đánh dấu và nếu được sửa đổi sẽ ảnh hưởng đến tất cả các chế độ khác.

Tôi có thể đặt ma thuật nào vào markdown-mode-hook để đặt khuôn mặt mặc định cho bộ đệm bằng chế độ này?

+0

Nếu có một số biến kiểm soát khuôn mặt mặc định thì bạn có thể bản địa hóa nó cho bộ đệm hiện tại chỉ trong một móc được gọi trong khi mở tệp w/markdown. – jfs

+0

Câu hỏi được hỏi theo cách tổng quát, sau đó một ví dụ cụ thể được thực hiện và câu trả lời xoay quanh ví dụ cụ thể này. Nếu bạn thực sự cần "** Đặt Emacs defaut font face per-mode **", hãy xem [Sử dụng một phông chữ khác cho mỗi chế độ chính - Emacs Stack Exchange] (http://emacs.stackexchange.com/questions/3038/ Sử dụng-một-khác-font-cho-mỗi-chính-mode/3042 # 3042) –

Trả lời

27

Làm thế nào về một cái gì đó như thế này:

(add-hook 'markdown-mode-hook (lambda() (variable-pitch-mode t)) 

Sau đó bạn có thể tùy chỉnh các mặt variable-pitch, và những gương mặt khác trong bộ đệm sẽ thừa hưởng từ thay này của khuôn mặt mặc định.

Đọc tài liệu cho buffer-face-mode để biết thêm chi tiết tùy chỉnh. (BufFace cũng được sử dụng cho text-scale-increasetext-scale-decrease ... rất hữu ích.)

+0

Để hiểu biết của tôi điều này đòi hỏi Emacs 23, không thể tìm thấy không 'biến-pitch-mode' hay' buffer-face-mode' trong Emacs 22. – danielpoe

+1

Chà, mọi người vẫn dùng Emacs 22? – jrockway

+0

Cảm ơn, không phải là lừa. Tuy nhiên, khi bộ đệm sử dụng các phông chữ có độ dài thay đổi, việc di chuyển trở nên chậm đến mức không thể sử dụng được. Nhưng điều này có lẽ chỉ là một lỗi. –

6

Tôi phải trả lời một phần vì quá phức tạp để tìm ra tại chỗ và tôi đã thổi ngân sách thời gian của mình.

Khuôn mặt là thuộc tính khung. Một khung có thể hiển thị nhiều bộ đệm cùng một lúc. Chế độ là thuộc tính bộ đệm. Bạn hỏi làm thế nào để thay đổi khuôn mặt trên cơ sở cho mỗi chế độ. Kết hợp tất cả điều này, có vẻ như câu hỏi không thể không có một câu trả lời hoàn toàn chính xác.

Bạn có thể ước tính câu trả lời mong muốn nếu bạn cho rằng một khung nhất định sẽ không bao giờ hiển thị nhiều hơn một bộ đệm. Bạn có thể thực sự thực hiện điều đó với một cái gì đó như thế này, nhưng sửa đổi để sử dụng đặc biệt-hiển thị-regexps và một tập hợp các regexps phù hợp với tên đệm chế độ markdown của bạn.

(append special-display-buffer-names 
     '("*VC-log*" 
      "*Help*" 
      ("*Completions*" 
      (height . 25) 
      (font . "8x13")))) 

Tuy nhiên, điều này có lẽ không phải là điều bạn muốn. Câu hỏi của bạn dường như ngụ ý thay đổi các đặc tính khuôn mặt của một khung hình duy nhất.

Một lần nữa giả định rằng khung sẽ không bao giờ hiển thị nhiều bộ đệm cùng một lúc, bạn có thể thử thông báo chuyển sang bộ đệm. Nhưng điều đó có thể không đủ thấp và nó có thể quá chậm. (Chưa được kiểm tra)

(defadvice switch-to-buffer (after switch-to-buffer activate compile) 
    "change the frame's default face after switch-to-buffer" 
    (doSomethingToChangePropertiesOfDefaultFace)) 

Và bây giờ cho thực tế (không đầy đủ) Câu trả lời của tôi ...

Một tốt hơn, mặc dù phức tạp hơn, cách tiếp cận sẽ hướng dẫn markdown chế độ sử dụng một diện mạo mới cho tất cả các vùng mà không phải là đã được gán một trong các khuôn mặt dựng sẵn. Bạn có thể tạo một khuôn mặt mới với bản sao mặt và cung cấp cho nó các thuộc tính thú vị với set-face- *.

Sửa đổi mặc định phông chữ khóa của chế độ đánh dấu để ghi đè chức năng phông chữ-khóa-fontify-region mặc định như được mô tả trong khối chú thích gần dòng 946 của font-lock.el bắt đầu, "Chức năng phông chữ".Có thể bạn có thể sử dụng một phông chữ-lock-mặc-fontify vùng rất chút thay đổi mà không chỉ là một phụ bước ngay sau nó:

(unless font-lock-keywords-only 
    (font-lock-fontify-syntactically-region beg end loudly)) 

Bước thêm phân tích các khu vực tương tự với những gì font-lock-fontify- vùng cú pháp, phá vỡ khu vực thành các tiểu vùng "thú vị". Nhưng lần này bạn tìm thấy các vùng phụ có khuôn mặt mặc định và bạn đặt văn bản thuộc tính các vùng con đó vào khuôn mặt mới mà bạn đã tạo trước đây.

Trong tất cả điều này, cảm giác như nó chỉ là một vài dòng trong tập tin .emacs của bạn, cộng thêm một bản sao của phông chữ-lock-mặc định-fontify-khu vực mà chỉ có một khác biệt nhỏ so với bản gốc (gọi một chức năng mới), cộng với tạo một bản sao của font-lock-fontify-syntactically-region và sửa đổi nó để thực hiện việc đặt giá thầu của bạn (phần khó nhất).

Trên thực tế, nếu bạn "sau" tư vấn cho phông chữ-khóa-fontify-cú pháp-khu vực thì bạn có thể thậm chí không cần phải sửa đổi mặc định phông chữ-khóa hoặc font-lock-mặc định-fontify-khu vực.

+0

Tên và số dòng nói với emacs GNU 22.3.1. – JeffJ

+0

Hoặc chỉ nhận phiên bản mới của các emac và sử dụng chế độ đệm-mặt. – jrockway

+0

Tuyệt. Nhưng tôi có lẽ sẽ đợi cho đến khi emacs 23 thực sự tàu trước khi cập nhật nó. – JeffJ

2

Nó thực sự đơn giản ngay cả đối với emacs phiên bản 22.3.1 ...

Chỉ cần thử như sau:

(progn 
    (set-buffer "your buffer name here") 
    (overlay-put (make-overlay 0 (buffer-size)) 'face 'your-face)) 
+0

bạn cũng có thể tìm thấy định nghĩa của hàm có thể dễ dàng thay đổi phông chữ của bộ đệm tại http://junis.orgfree.com/SetBufferFont.el –

+0

lớp phủ không tốt vì chúng chậm. chúng chỉ tốt nếu bạn không có quá nhiều trong cùng một thời điểm ... – alinsoar

5

Các variable-pitch -mode là tuyệt vời. Tôi đã tìm hiểu về nó thông qua chủ đề này. Nhưng nó có thể được thực hiện tuyệt vời hơn nữa:

(dolist (hook '(erc-mode-hook 
     LaTeX-mode-hook 
     org-mode-hook 
     edit-server-start-hook 
     markdown-mode-hook)) 
    (add-hook hook (lambda() (variable-pitch-mode t)))) 

Chỉ cần thêm bất kỳ chế độ nào bạn muốn phông chữ sans-serif vào danh sách.

+0

Những gì đoạn mã trên là để cho phép 'biến-pitch-mode' cho tất cả các chế độ liệt kê trong tất cả các dòng trừ cuối cùng. –

0

Có một khối mã mà tôi thấy rất thuận tiện, từ EmacsWiki. Ưu điểm của việc này là bạn có thể đặt khuôn mặt không chỉ font chữ, nhưng thuận tiện cấu hình :height, :width vv cũng

;; Use variable width font faces in current buffer 
(defun my-buffer-face-mode-variable() 
    "Set font to a variable width (proportional) fonts in current buffer" 
    (interactive) 
    (setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed)) 
    (buffer-face-mode)) 
;; Use monospaced font faces in current buffer 
(defun my-buffer-face-mode-fixed() 
    "Sets a fixed width (monospace) font in current buffer" 
    (interactive) 
    (setq buffer-face-mode-face '(:family "Consolas" :height 100)) 
    (buffer-face-mode)) 
;; Set default font faces for Info and ERC modes 
(add-hook 'erc-mode-hook 'my-buffer-face-mode-variable) 
(add-hook 'Info-mode-hook 'my-buffer-face-mode-variable) 

Kết hợp với load-theme-buffer-local gói, bạn thậm chí có thể xác định các chủ đề màu sắc cho bộ đệm dễ dàng:

(defun my-buffer-face-mode-variable() 
    "Set font to a variable width (proportional) fonts in current buffer" 
    (interactive) 
    (setq buffer-face-mode-face '(:family "DejaVu Sans" :height 100 :width semi-condensed)) 
    (buffer-face-mode) 
    (load-theme-buffer-local 'leuven (current-buffer))) 
Các vấn đề liên quan