วิธีกำหนดเยื้องโหมดองค์กร


12

คำถามนี้เกิดขึ้นจริงเพราะฉันชอบที่จะใช้แบบอักษรที่ไม่ใช่แบบโมโนโพสต์, (Sabon, Minion, Garamond ฯลฯ ) ทำให้เกิดปัญหาเมื่อใช้โหมด org-indent เนื่องจากข้อความใต้หัวข้อไม่ตรงกับหัวเรื่อง ตัวอย่าง: ป้อนคำอธิบายรูปภาพที่นี่

แบบอักษรคือจอร์เจีย ตอนนี้ถ้าฉันเปลี่ยนเป็น consolas:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันคิดว่าปัญหาคือว่าในฟอนต์ที่ไม่ใช่แบบโมโนโพสต์ "ช่องว่าง" และ * ไม่ใช้พื้นที่เดียวกัน แม้ว่าฉันจะไม่รู้วิธีแก้ปัญหานี้ ฉันค้นหาทางอินเทอร์เน็ตและไม่พบบทช่วยสอนเพื่อปรับการเยื้องของตัวเอง ฉันพยายามอ่าน org-indent.el แต่มันก็นานสำหรับฉันที่จะเข้าใจ ความช่วยเหลือได้รับการชื่นชมอย่างมาก!


ฉันชอบใช้ฟอนต์ serif ที่เว้นระยะในสัดส่วนใน Emacs และพบปัญหาที่คล้ายกัน ฉันคิดว่าอาจมีการปรับแต่งแบบอักษรเพื่อช่วย แต่ฉันยังไม่ได้ตรวจสอบอย่างละเอียด
Christian Gagné

1
เสียงเช่นนี้ไม่เกี่ยวข้องกับโหมด Org และคุณเพียงแค่สงสัยว่าจะได้รับการจัดแนวแบบอักษรที่ไม่ใช่แบบโมโนสเกลได้อย่างไร คำตอบคือคุณต้องทำโดยใช้รหัส - คุณไม่สามารถพึ่งพาช่องว่างที่มีความกว้างเท่ากับตัวอักษรอื่น ๆ ฯลฯ โดยทั่วไปแล้วคุณไม่มีโชค
Drew

@ ดึงคุณอาจพูดถูก "ทั่วไป" แต่สำหรับปัญหาเฉพาะนี้มีวิธีแก้ไขให้ดูคำตอบของฉัน ช่องว่างชั้นนำที่ใช้สำหรับการเยื้องโดยorg-indentไม่ได้มีอยู่จริงพวกเขาเป็นเพียงline-prefixคุณสมบัติดังนั้นพวกเขาสามารถถูกแทนที่ด้วยตัวละครอื่น ๆ ตราบใดที่มันมองไม่เห็น
เลิกใช้

@deprecated: ฉันเห็น ขอบคุณสำหรับการแก้ไข BTW บางทีองค์กรเองอาจเป็นค่าเริ่มต้นทำสิ่งที่คุณแนะนำ หรือเพียงแค่ใช้SPCตัวอักษร แต่มีคุณสมบัติข้อความ (หรือซ้อนทับ) ที่กำหนดใบหน้าที่ (โดยค่าเริ่มต้น) มีแบบอักษร monospaced อาจจะมีการร้องขอการเพิ่มประสิทธิภาพองค์กรตามลำดับ ;-)
Drew

@ ดึงมันเป็นเรื่องง่ายมากที่จะทำเช่นนั้นด้วยแบบอักษร - ล็อคใช่ไหม?
Clément

คำตอบ:


9

ทางออกหนึ่งคือการปรับเปลี่ยนorg-indent-stringsเพื่อใช้ดาวแทนช่องว่างเป็นอักขระการเยื้อง ซึ่งหมายความว่าความกว้างของการเยื้องจะถูกต้องเสมอแม้ว่าจะใช้แบบอักษรที่มีสัดส่วน เคล็ดลับก็คือการตั้งค่าสีพื้นหน้าของการเยื้องเป็นสีเดียวกับสีพื้นหลังเพื่อให้ดาวกลายเป็นมองไม่เห็น

เราสามารถทำสิ่งนี้ได้ด้วยโค้ดต่อไปนี้ซึ่งแนะนำฟังก์ชั่น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")

ผลลัพธ์มีลักษณะเช่นนี้สำหรับฉันใน Mac OS X ที่ใช้emacs -Qและ(set-face-font 'default :family "Gill Sans"):

ป้อนคำอธิบายรูปภาพที่นี่


สวัสดี @ เลิกขอบคุณมากสำหรับการให้คำตอบ! นี่เป็นคำถามที่งี่เง่า แต่ฉันควรวางรหัสของคุณใน org-indent.el หรือ init.el ของฉันหรือไม่ ดูเหมือนจะไม่ทำงานสำหรับฉัน ฉันใช้ Emacs 24.4 ใน windows ฉันต้องรวบรวมอะไรหรืออะไร? ขอบคุณ!
อเล็กซ์

ไม่เป็นไรฉันถามคำถามงี่เง่า ฉันต้องการรวบรวม org-indent.el สำหรับการอ้างอิงในอนาคต: วิธีที่ง่ายที่สุดที่จะเปลี่ยนแปลงบรรทัดนี้ (concat (make-string (1- i) ?\ ) จะ (concat (make-string (1- i) ?*) อยู่ในความหมายของorg-indent-initializeIE (defun org-indent-initialize... แล้วใช้ Mx ไบต์รวบรวมไฟล์ไปยังรวบรวม org-indent.el ไปยังองค์กร-indent.elc จากนั้นรีสตาร์ท emacs
Alex

3

คำตอบที่คัดค้านนั้นดีมาก แต่ก็ไม่ได้ผลสำหรับฉัน ปัจจุบันฉันใช้ Emacs 24.4 และ org 8.2.4 และการให้คำปรึกษาorg-indent-initializeไม่ได้ทำอะไรเลย ฉันต้องกำหนดฟังก์ชั่นใหม่ด้วยตัวอักษรที่เยื้องเปลี่ยนไปและใช้งานได้ บางทีเมื่อฉันอัพเกรดเป็น Emacs 24.5 และ org 8.3 คำแนะนำจะใช้ได้

แต่ฉันก็ต้องทำการปรับแต่งอื่น ๆ อีกสองสามตัวเพราะฉันใช้แบบอักษรที่มีความกว้างต่างกันของตัวแปรสำหรับระดับหัวเรื่องที่แตกต่างกันซึ่งหมายความว่าหัวเรื่องของหัวเรื่องระดับ 1 *นั้นไม่กว้างเท่ากับของระดับ 2 และอื่น ๆ

ดังนั้นฉันต้องทำเช่นนี้:

  1. ตั้งค่าใบหน้าorg-hide(ใช้เพื่อเยื้องบรรทัดบรรทัดแรก) และorg-indent(ใช้เพื่อเยื้องบรรทัดที่ไม่ใช่บรรทัดแรก) เพื่อให้แน่ใจว่าพวกเขาใช้แบบอักษรเดียวกันในขนาดเดียวกัน
  2. ตั้งค่าตัวแปรorg-indent-boundary-characterที่จะ*แทนการเริ่มต้น(พื้นที่) นี่คืออักขระที่ถูกแทรกหลังอักขระย่อหน้า แต่ก่อนหน้าเนื้อหา ฉันไม่แน่ใจว่าการเปลี่ยนแปลงนี้จำเป็นหรือไม่ แต่ดูเหมือนว่าจะช่วยให้เกิดความมั่นคง มันอาจขึ้นอยู่กับตัวอักษรที่คุณใช้ขนาดและอื่น ๆ

การทำสิ่งเหล่านั้นนอกเหนือจากการเปลี่ยนแปลงorg-indent-initializeตามที่ได้ระบุไว้แล้วดูเหมือนว่าได้กระทำไปแล้ว ฉันท้ายด้วยบัฟเฟอร์ที่มีลักษณะเช่นนี้:

ภาพหน้าจอ

คุณจะเห็นได้ว่าเมื่อระดับพาดหัวลดลงการเยื้องไม่เข้ากันอย่างสมบูรณ์แบบกับข้อความส่วนหัว ฉันคิดว่าเป็นเพราะการใช้แบบอักษรขนาดเล็กสำหรับหัวเรื่องระดับล่างและฉันไม่คิดว่าจะมีวิธีง่าย ๆ ในการแก้ไข อาจเป็นไปได้ที่จะทำบางสิ่งบางอย่างด้วยคุณสมบัติข้อความเช่นline-prefixและwrap-prefixเนื่องจากสิ่งเหล่านี้สามารถตั้งค่าเป็นรูปภาพและอักขระพิเศษ แต่อาจจะซับซ้อนและช้า หากคุณใช้ขนาดตัวอักษรเท่ากันสำหรับทุกระดับหัวเรื่องสิ่งนี้อาจไม่เป็นปัญหา

อย่างไรก็ตามนี่อาจจะดีพอ :)

ป.ล. ตามที่ร้องขอนี่คือorg-levelใบหน้าของฉัน สิ่งเหล่านี้คัดลอกมาจากcustom-set-facesแต่ถ้าคุณไม่ได้ใช้customizeคุณสามารถตั้งค่าไว้ด้านนอกได้

 '(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 ฉันชอบรูปลักษณ์นี้ คุณมีการตั้งค่าที่สมบูรณ์เพื่อให้โพสต์นี้อยู่ที่ไหนสักแห่ง?
erikstokes

ฉันใช้solarized-darkธีมซึ่งเป็นส่วนหนึ่งของsolarized-themeแพ็คเกจที่คุณสามารถติดตั้งได้จาก ELPA สำหรับorg-level-*ใบหน้าฉันจะเพิ่มพวกเขาในคำตอบข้างต้น
blujay

มันดูเท่สุด ๆ คุณจะแทนที่ค่าเริ่มต้น * ด้วยสัญลักษณ์พิเศษเหล่านั้นได้อย่างไร
Alex

นั่นคือจากorg-bulletsแพคเกจ เรียกใช้และตรวจสอบแพ็กเกจทั้งหมดที่เริ่มต้นด้วยpackage-list-packages org-:)
blujay

2

อย่างใดฉันไม่สามารถรับคำตอบอื่น ๆ สำหรับการตั้งค่าของฉัน แต่การแก้ไขที่เร็วและง่ายที่สุดสำหรับฉันคือ:

`M-x customize-face org-hide`

จากนั้นเพียงเปลี่ยนFont Familyแอตทริบิวต์เป็นแบบอักษร monospace ของคุณ (ในกรณีของฉันIosevka)

และนั่นคือทั้งหมดที่คุณต้องทำเนื่องจากorg-indent(ใบหน้าเพื่อเยื้องเค้าร่าง) สืบทอดโดยอัตโนมัติจากorg-hide(ใบหน้าที่ใช้ซ่อนดาวชั้นนำในหัวข้อ)

ป้อนคำอธิบายรูปภาพที่นี่


1

โซลูชันที่ง่ายกว่ามาก: ในโหมดองค์กรให้กดM-:และเรียกใช้สิ่งต่อไปนี้

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

คุณอาจต้องการM-x font-lock-fontify-bufferหลังจากนั้น วิธีนี้จะบังคับให้ตัวละครนำ (ช่องว่างและดวงดาว) ใช้อักษรตัวเดียว

นอกจากนี้คุณจะต้องแทนที่ "อูบุนตูโมโน" ด้วยแบบอักษรที่คุณเลือก


ไม่จำเป็นต้องพิจารณาโซลูชันอื่นอีกต่อไป :)
blujay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.