Làm thế nào để tùy chỉnh thụt lề chế độ org?


12

Câu hỏi này thực sự xuất hiện bởi vì tôi thích sử dụng các phông chữ không đơn cách, (Sabon, Minion, Garhua, v.v.) Điều này gây ra vấn đề khi sử dụng chế độ org-indent, vì văn bản dưới tiêu đề hiện không được căn chỉnh với tiêu đề. Thí dụ: nhập mô tả hình ảnh ở đây

Phông chữ là Georgia. Bây giờ, nếu tôi đổi thành consolas:

nhập mô tả hình ảnh ở đây

Tôi nghĩ vấn đề là ở các phông chữ không đơn cách, "khoảng trắng" và * không chiếm cùng một không gian. Mặc dù tôi không biết làm thế nào để giải quyết điều này. Tôi đã tìm kiếm trên internet và không thể tìm thấy một hướng dẫn để tinh chỉnh vết lõm. Tôi đã cố đọc org-indent.el nhưng đó là một cú đánh dài để tôi hiểu. Trợ giúp được đánh giá rất cao!


Tôi cũng thích sử dụng phông chữ serif cách đều nhau trong Emacs và đã gặp phải các vấn đề tương tự. Tôi đã nghĩ rằng có lẽ một số điều chỉnh về phông chữ có thể giúp ích, nhưng tôi chưa xem xét kỹ về nó.
Christian Gagné

1
Âm thanh như thế này không liên quan gì đến chế độ Org và bạn chỉ đang tự hỏi làm thế nào để các phông chữ không đơn cách được căn chỉnh. Câu trả lời là bạn cần phải làm điều đó bằng cách sử dụng mã - bạn không thể dựa vào các ký tự không gian có cùng chiều rộng với các ký tự khác, v.v. Nói tóm lại, nói chung bạn không gặp may.
vẽ

@Drew bạn có thể đúng "nói chung". Nhưng đối với vấn đề cụ thể này có một giải pháp, xem câu trả lời của tôi. Các không gian hàng đầu được sử dụng để thụt đầu dòng org-indentkhông thực sự ở đó, chúng chỉ là line-prefixcác thuộc tính, vì vậy chúng có thể được thay thế bởi bất kỳ nhân vật nào khác miễn là nó vô hình.
không dùng nữa vào

@deprecated: Tôi thấy. Cảm ơn vì sự đúng đắn của bạn. BTW, có lẽ chính Org có thể, được mặc định, làm những gì bạn đề xuất. Hoặc chỉ sử dụng SPCký tự nhưng với thuộc tính văn bản (hoặc lớp phủ) áp đặt một khuôn mặt (theo mặc định) có phông chữ đơn cách. Có lẽ một yêu cầu tăng cường Org là theo thứ tự. ;-)
vẽ

@Drew thực sự rất dễ dàng để làm điều đó với khóa chữ, phải không?
Clément

Câu trả lời:


9

Một giải pháp là sửa đổi org-indent-stringsđể sử dụng các ngôi sao thay vì khoảng trắng làm ký tự thụt. Điều này có nghĩa là chiều rộng của vết lõm sẽ luôn chính xác, ngay cả khi sử dụng phông chữ tỷ lệ. Bí quyết sau đó là đặt màu nền trước của vết lõm giống với màu nền, để các ngôi sao trở nên vô hình.

Chúng ta có thể đạt được điều này với đoạn mã sau, thông báo cho hàm org-indent-initialize:

(require 'cl)
(defun org-indent-use-stars-for-strings ()
  "Initialize the indentation strings with stars instead of spaces."
  (setq org-indent-strings (make-vector (1+ org-indent-max) nil))
  (aset org-indent-strings 0 nil)
  (loop for i from 1 to org-indent-max do
    (aset org-indent-strings i
          (org-add-props
          (concat (make-string (1- i) ?*) ; <- THIS IS THE ONLY CHANGE
              (char-to-string org-indent-boundary-char))
          nil 'face 'org-indent))))

(advice-add 'org-indent-initialize :after #'org-indent-use-stars-for-strings)
(set-face-foreground 'org-indent "white")

Kết quả trông như thế này đối với tôi trên Mac OS X khi sử dụng emacs -Q(set-face-font 'default :family "Gill Sans"):

nhập mô tả hình ảnh ở đây


Xin chào @deprecated, cảm ơn bạn rất nhiều vì đã cung cấp câu trả lời! Đây là một câu hỏi ngớ ngẩn nhưng tôi nên đặt mã của bạn trong org-indent.el hoặc init.el của tôi? Không có vẻ làm việc cho tôi. Tôi đang sử dụng Emacs 24.4 dưới cửa sổ, - tôi có cần biên dịch bất cứ thứ gì hay không? Cảm ơn!
Alex

Tôi đã hỏi một câu hỏi ngu ngốc. Tôi cần phải biên dịch org-indent.el. Để tham khảo trong tương lai: cách đơn giản nhất để thay đổi dòng này: (concat (make-string (1- i) ?\ ) để (concat (make-string (1- i) ?*) trong định nghĩa của org-indent-initializeví dụ (defun org-indent-initialize... sau đó sử dụng Mx byte-biên dịch tập tin để biên dịch org-indent.el để org-indent.elc. Sau đó khởi động lại emacs.
Alex

3

Câu trả lời không được chấp nhận là rất tốt, nhưng nó không hiệu quả với tôi. Tôi hiện đang sử dụng Emacs 24.4 và org 8.2.4 và khuyên org-indent-initializerằng không nên làm gì cả. Tôi đã phải xác định lại chức năng với ký tự thụt lề đã thay đổi, và điều đó đã làm việc. Có thể khi tôi nâng cấp lên Emacs 24.5 và org 8.3, lời khuyên sẽ hoạt động.

Nhưng tôi cũng phải thực hiện một vài điều chỉnh khác, bởi vì tôi sử dụng phông chữ có chiều rộng thay đổi kích thước khác nhau cho các cấp tiêu đề khác nhau, điều đó có nghĩa là tiêu đề cấp 1 *không có cùng chiều rộng với cấp độ 2, v.v.

Vì vậy, tôi cũng đã phải làm điều này:

  1. Đặt các mặt org-hide(được sử dụng để thụt dòng tiêu đề) và org-indent(được sử dụng để thụt dòng không phải dòng tiêu đề) để đảm bảo chúng sử dụng cùng một phông chữ ở cùng kích thước.
  2. Đặt biến org-indent-boundary-characterthành *thay vì mặc định (khoảng trắng). Đây là ký tự được chèn sau các ký tự thụt đầu dòng nhưng trước nội dung. Tôi không chắc chắn nếu thay đổi điều này là cần thiết, nhưng nó dường như giúp thống nhất. Nó có thể phụ thuộc vào phông chữ bạn đang sử dụng, kích cỡ, v.v.

Làm những việc đó ngoài việc thực hiện thay đổi org-indent-initializenhư bị phản đối cung cấp dường như đã làm điều đó. Tôi kết thúc với một bộ đệm trông như thế này:

ảnh chụp màn hình

Bạn có thể thấy rằng, khi mức tiêu đề giảm xuống, vết lõm không thẳng hàng hoàn hảo với văn bản tiêu đề. Tôi nghĩ đó là do sử dụng phông chữ nhỏ hơn cho các tiêu đề cấp thấp hơn và tôi không nghĩ có một cách dễ dàng để khắc phục điều đó. Có thể làm điều gì đó với các thuộc tính văn bản như line-prefixwrap-prefixbởi vì chúng có thể được đặt thành hình ảnh và ký tự đặc biệt, nhưng điều đó có thể sẽ phức tạp và chậm. Nếu bạn sử dụng cùng kích thước phông chữ cho tất cả các cấp tiêu đề, điều này có thể sẽ không thành vấn đề.

Dù sao, điều này có lẽ là đủ tốt. :)

PS Theo yêu cầu, đây là org-levelkhuôn mặt của tôi . Chúng được sao chép từ custom-set-faces, nhưng nếu bạn không sử dụng, customizebạn có thể đặt chúng bên ngoài nó.

 '(org-level-1 ((t (:inherit variable-pitch :foreground "#cb4b16" :weight bold :height 1.3))))
 '(org-level-2 ((t (:inherit variable-pitch :foreground "#859900" :weight bold :height 1.2))))
 '(org-level-3 ((t (:inherit variable-pitch :foreground "#268bd2" :weight bold :height 1.15))))
 '(org-level-4 ((t (:inherit variable-pitch :foreground "#b58900" :weight bold :height 1.1))))
 '(org-level-5 ((t (:inherit variable-pitch :foreground "#2aa198" :weight bold))))
 '(org-level-6 ((t (:inherit variable-pitch :foreground "#6c71c4" :weight bold))))
 '(org-level-7 ((t (:inherit variable-pitch :foreground "#d33682" :weight bold))))
 '(org-level-8 ((t (:inherit variable-pitch :foreground "#dc322f" :weight bold))))

@bluejay Mình thích cái này trông thế nào. Bạn có cấu hình đầy đủ để có được đăng này ở đâu đó không?
erikstokes

Chà, tôi đang sử dụng solarized-darkchủ đề, một phần của solarized-themegói mà bạn có thể cài đặt từ ELPA. Đối với org-level-*khuôn mặt, tôi sẽ thêm chúng vào câu trả lời ở trên.
blujay

Điều này có vẻ siêu mát mẻ. Làm thế nào để bạn thay thế mặc định * bằng các biểu tượng đặc biệt?
Alex

Đó là từ org-bulletsgói. Chạy package-list-packagesvà kiểm tra tất cả các gói bắt đầu với org-. :)
blujay

2

Bằng cách nào đó tôi không thể có được câu trả lời khác để làm việc cho thiết lập của mình, nhưng cách khắc phục nhanh nhất và dễ nhất có hiệu quả với tôi là:

`M-x customize-face org-hide`

Sau đó, chỉ cần thay đổi Font Familythuộc tính thành phông chữ đơn cách của bạn (trong trường hợp của tôi, Iosevka).

Và đó thực sự là tất cả những gì bạn phải làm , vì org-indent(khuôn mặt để thụt lề phác thảo) tự động thừa hưởng từ org-hide(khuôn mặt được sử dụng để ẩn các ngôi sao hàng đầu trong tiêu đề)

nhập mô tả hình ảnh ở đây


1

Một giải pháp đơn giản hơn nhiều: trong chế độ org, nhấn M-:và chạy như sau

(font-lock-add-keywords 
 nil 
 '(("^[[:space:]*]+" 0 '(face (:family "Ubuntu Mono")) append))
 'append)

Bạn có thể cần M-x font-lock-fontify-buffersau đó. Giải pháp này chỉ đơn giản là buộc các nhân vật hàng đầu (không gian và ngôi sao) sử dụng phông chữ đơn cách.

Ngoài ra, bạn sẽ muốn thay thế "Ubuntu Mono" bằng phông chữ đơn cách bạn chọn,


Điều này không còn cần thiết khi xem xét các giải pháp khác. :)
blujay
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.