Phông chữ một vùng của bộ đệm với chế độ chính khác


12

Tôi có một bộ đệm hiển thị tài liệu cho các mô-đun Ansible. Bộ đệm này có chế độ chính của nó cung cấp tất cả các công cụ tiêu chuẩn. Đáng chú ý, nó phông chữ bộ đệm để làm nổi bật đánh dấu nội tuyến, tùy chọn, phần, vv Tất cả trong tất cả, nó khá giống với M-x man.

Ở dưới cùng của tài liệu thường có một số ví dụ mã trong YAML. Tôi cũng muốn phông chữ những cái này. Dĩ nhiên, tôi có thể thêm các từ khóa khóa phông chữ của mình cho YAML, nhưng tôi thích sử dụng lại việc sử dụng phông chữ của Chế độ YAML.

Làm thế nào tôi có thể làm điều đó? Cụ thể, làm cách nào tôi có thể sử dụng một chế độ chính khác để phông chữ một vùng cụ thể của bộ đệm?

Lưu ý rằng Chế độ YAML không cần phải hoạt động trong khu vực này. Toàn bộ bộ đệm chỉ là bộ đệm hiển thị thụ động và không có ý định chỉnh sửa. Tôi thực sự chỉ cần phông chữ được tạo ra như thể Chế độ YAML đang hoạt động trong khu vực đó.

Tôi đoán rằng tôi có thể sao chép vùng đệm vào bộ đệm tạm thời, bật Chế độ YAML, phông chữ bộ đệm và sao chép tất cả các thuộc tính văn bản qua. Liệu điều đó có hiệu quả? Nếu vậy, làm cách nào để sao chép các thuộc tính văn bản và các thuộc tính có liên quan để sao chép là gì? Hoặc có một cách tiếp cận tốt hơn?


Làm thế nào là phông chữ không yaml được thực hiện? Bạn có áp dụng các thuộc tính văn bản theo cách thủ công hay bạn sử dụng chế độ khóa phông chữ?
Malabarba

Các liên kết trong bài viết này tổng hợp ít nhất một đoạn tốt đẹp của các tùy chọn trên mạng: wisdomandwonder.com/link/8610/...
grettke

Câu trả lời:


10

Gần đây tôi đã gặp một vấn đề tương tự, về cơ bản tôi muốn phông chữ các đoạn mã trong tài liệu mà tôi có một số nguồn khác. Tôi đã làm theo cách tiếp cận được đề cập đến cuối câu trả lời của bạn và nó hoạt động tốt với tôi. Hàm tôi đã kết thúc với một số thứ như sau

(defun my-fontify-yaml (text)
  (with-temp-buffer
    (erase-buffer)
    (insert text)
    (delay-mode-hooks (yaml-mode))
    (font-lock-default-function 'yaml-mode)
    (font-lock-default-fontify-region (point-min)
                                      (point-max)
                                      nil)
    (buffer-string)))

Như @Malabarba đã chỉ ra trong các bình luận, cách tiếp cận đơn giản ở trên không hoạt động nếu bộ đệm đích sử dụng chế độ khóa phông chữ. Tuy nhiên, chúng ta có thể lừa chế độ khóa phông chữ để tin rằng chuỗi đã bị khóa phông bằng cách đặt thuộc tính văn bản font-lock-facethành face, (chúng ta lấy tập thuộc facetính, khi chúng ta sử dụng hàm ở trên) và đặt thuộc tính văn bản fontifiedthành t. Hàm sau lấy một chuỗi được trả về bởi hàm ở trên và thực hiện xử lý theo yêu cầu để chuỗi được chèn vào phông chữ (hàm này được lấy từ org-src-font-lock-fontify-blockhàm của chế độ org

(defun my-fontify-using-faces (text)
  (let ((pos 0))
    (while (setq next (next-single-property-change pos 'face text))
      (put-text-property pos next 'font-lock-face (get-text-property pos 'face text) text)
      (setq pos next))
    (add-text-properties 0  (length text) '(fontified t) text)
    text))

Bây giờ bạn có thể sử dụng nó như sau

(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))

Đây là cùng một giải pháp tôi đã tìm thấy sx.el, nhưng điều quan trọng cần lưu ý là nó sẽ chỉ hoạt động nếu bộ đệm đích không sử dụng chế độ khóa phông chữ.
Malabarba

Đúng! Tôi mới nhận ra điều này hiệu quả với tôi vì tôi đã sử dụng bộ đệm trong đó khóa chữ không được sử dụng (Bộ đệm trợ giúp)
Iqbal Ansari

@Malabarba đã tìm ra cách để làm cho công việc này với bộ đệm đích với chế độ khóa phông chữ được bật
Iqbal Ansari


Ồ tốt đẹp Vui mừng tôi có thể giúp :)
Iqbal Ansari

3

Thư viện thu hẹp gián tiếp ( narrow-indirect) có thể giúp đỡ ở đây - hãy xem bình luận tiêu đề. Điều đó dựa vào:

  1. thu hẹp, giới hạn chỉnh sửa một phần trên bộ đệm và
  2. bộ đệm gián tiếp, sao chép bộ đệm trong một bộ đệm khác mà bạn có thể thay đổi chế độ chính.

Lưu ý rằng thu hẹp được tắt theo mặc định vì nó được coi là không bắt đầu (không ràng buộc mặc định C-x n n). Bạn có thể kích hoạt nó bằng cách đặt các mục sau vào tệp init của bạn:

(put 'narrow-to-region 'disabled nil)

Bạn cũng có thể nhìn vào handmade myfn-narrow-indirectcủa tôi trong conf của tôi .


Có thu hẹp thực sự ảnh hưởng đến khóa phông chữ, tức là giữ nó ra khỏi bên ngoài của khu vực bị thu hẹp? Có khóa chữ thực sự không bao giờ loại bỏ hạn chế bộ đệm?
lunaryorn

Và dù sao, một gói wiki không phải là một lựa chọn.
lunaryorn

Ngoài ra, bạn không cần xóa thuộc disabledtính khỏi lệnh để gọi nó từ Emacs Lisp. Nó chỉ ảnh hưởng đến việc sử dụng tương tác.
lunaryorn

0

Tôi sẽ đề nghị xem xét org-src-font-lock-fontify-block cung cấp chức năng này cho các khối nguồn chế độ org. Dường như chỉ sao chép các phần có liên quan sang bộ đệm khác, bật chế độ chính ở đó và sau đó sao chép văn bản đã được phông chữ trở lại. Hackish, nhưng nó có vẻ hoạt động.


2
Câu trả lời này trông giống như một bình luận trong chừng mực vì nó cung cấp một hướng được đề xuất để giải quyết vấn đề, nhưng không phải là một câu trả lời hoàn chỉnh. Hãy xem xét thay đổi nó để bình luận.
Dân
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.