ฉันจะหลีกเลี่ยง * ในโหมดองค์กรได้อย่างไรเพื่อป้องกันการจัดรูปแบบตัวหนา


12

ถ้าผมเขียนสิ่งที่ต้องการ*shrug*ในโหมด org ก็จะถูก fontified โดยอัตโนมัติขณะที่ข้อความเป็นตัวหนา ฉันจะป้องกันสิ่งนั้นได้เช่นว่าจริง ๆ แล้ว*shrug*ปรากฏเป็นคำต่อคำเมื่อส่งออก?

แก้ไข:

ฉันยังต้องการที่จะใช้การจัดรูปแบบตัวหนา (โดยไม่ต้องเปลี่ยนรูปแบบตัวอักษรเริ่มต้นสำหรับตัวหนา) และมันไม่สำคัญว่าไฟล์ org ของฉันจะถูกส่งออกในรูปแบบไฟล์ใดเช่นควรทำงานกับ Markdown และ HTML ส่งออก.

นี่คือบางสิ่งที่สำคัญนั่นคือเหตุผลที่มันถูกเขียนเป็นตัวหนา แต่สำหรับอย่างอื่นฉันไม่มีความคิด * ยัก *


1
หากคุณกำลังส่งออกสิ่งนี้ไปยัง LaTeX ในภายหลังคุณสามารถลอง\ast{}shrug\ast{}หรือ\star{}shrug\star{}คล้ายกันโดยใช้ HTML คุณสามารถใช้การเข้ารหัสเอนทิตี: &#2a;หรือถ้าเพิ่มช่องว่างก่อนหรือหลังเครื่องหมายดอกจันเป็นตัวเลือก
wvxvw

ดูเหมือนว่าคำตอบของ suvayu เพียงแค่ห่อด้วยเครื่องหมายคำต่อคำคือสิ่งที่คุณต้องการ หรือคุณสามารถแก้ไข org-focus-alist เพื่อให้ใช้อักขระตัวอื่นเป็นตัวหนา
2699

ไม่แน่นอน = * shrug * = ผลลัพธ์ใน HTML ที่ถูกส่งออกที่จะห่อในcode-tag และใน markdown มี backticks ฉันต้องการให้ไม่มีการจัดรูปแบบ แต่อย่างใด
ติมอร์

คำถามที่แก้ไขแล้วเพื่อสะท้อนว่าการเปลี่ยน org-focus-alist ไม่ใช่ตัวเลือกจริงๆ ฉันไม่ต้องการเปลี่ยนทุกอย่างที่เป็นตัวหนาซึ่งมีอยู่ในไฟล์. org ของฉัน
ติมอร์

2
ที่\ast{}shrug\ast{}กล่าวถึงโดย wvxvw น่าจะเป็นตัวเลือกที่ดีที่สุดของคุณ มันส่งออกไปยัง html ∗shrug∗และไปยังลาเท็กซ์$\ast$shrug$\ast$โดยใช้หน่วยงานอักขระที่เหมาะสม org-toggle-pretty-entitiesแสดงเป็น UTF8 อักขระในบัฟเฟอร์องค์กร
สร้าง

คำตอบ:


9

คำตอบนี้ได้รับแรงบันดาลใจหลังจากคำแนะนำโดยรวมในรายการ GNU emacs-org-modeเพื่อใช้org-entity( C-h i g (org) Special symbols) \ast{}แทนอักขระเว้นวรรคความกว้างเป็นศูนย์ (ซึ่งฉันแนะนำในคำตอบอื่นของฉันที่นี่ )

ด้านล่างนี้เป็นโซลูชันทั่วไปที่ผู้ใช้ไม่จำเป็นต้องจดจำเอนทิตีองค์กรสำหรับสัญลักษณ์ต่างๆ มันแทรกองค์กรนิติบุคคล (ถ้ามี) เมื่อผู้ใช้ทำC-u SYMBOL; ทำงานสำหรับC-u *, C-u /, C-u =ฯลฯ

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

ดังนั้นเมื่อผู้ใช้พิมพ์C-u *, \ast{}ถูกแทรกและด้านล่างข้อความจะปรากฏขึ้นในพื้นที่สะท้อน,

แทรก 'org-entity' \ ast {} สำหรับสัญลักษณ์ *

หากorg-pretty-entitiesมีการตั้งค่าtข้างต้นแทรก\ast{}จะแสดง*เป็น

หากorg-entityไม่มีอยู่สำหรับอักขระXและหากผู้ใช้ทำC-u X , Xจะถูกแทรกเพียง 4 ครั้ง (ตามC-uปกติจะทำ)


1
มันดูสะดวกมาก หนึ่ง drwaback (ในความคิดของฉัน) ที่ยังคงอยู่คือไฟล์. org ซึ่งไม่ได้มีโครงสร้าง LaTeX ใด ๆ ตอนนี้มีบิตของไวยากรณ์ไม่ใช่โหมด org (LaTeX) กระจัดกระจายไปทั่วไฟล์ โดยวิธีการที่มีเหตุผลที่ไม่มีการสร้างเหมือน\*thisisnotbold\*อยู่หรือไม่?
ติมอร์

1
นี่คือไวยากรณ์ขององค์กรด้วย ตรวจสอบorg-entitiesเอกสาร
Kaushal Modi

8

การใช้ ZERO WIDTH SPACE Unicode ถ่าน

คุณสามารถแยกวิเคราะห์การเน้นตัวหนาได้โดยเพิ่มอักขระเว้นวรรคแบบความกว้างเป็นศูนย์ (ระบุโดย [ZWS] ในตัวอย่างด้านล่าง) ก่อนเครื่องหมายดอกจันแรกหรือหลังเครื่องหมายดอกจันที่สอง

ตัวอย่างด้านล่างทั้งสองส่งออกเป็น HTML ในการทดสอบของฉัน:

  • [ZWS] ก่อนเครื่องหมายดอกจันแรก

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] หลังจากเครื่องหมายดอกจันที่สอง

    This is some *bold* test and this is *not bold*​[ZWS].
    

คุณสามารถระบุความกว้างศูนย์ SPACE (ชื่อ Unicode) C-x 8 RET 200b RETโดยการทำ
ฉันใช้สิ่งนี้บ่อยมากดังนั้นฉันจึง จำกัด สิ่งนี้C-x 8 0ไว้


ปรับปรุง

ตามการอภิปรายในรายชื่อผู้รับจดหมาย emacs-org-modeไม่แนะนำให้ใช้อักขระที่ไม่ใช่ ASCII สำหรับการหลบหนี org-entitiesควรใช้แทนหากทำได้ ฉันก็เห็นด้วยกับสิ่งนั้นและคิดหาวิธีแก้ปัญหาอื่นที่ทำให้การใส่org-entitiesง่ายขึ้น ( C-u *ในกรณีนี้)


ในทางเทคนิคแล้วมันเป็นวิธีที่รวดเร็วในการแก้ปัญหา มันใช้โหมดองค์กรไม่ตีความ ZWS เป็นช่องว่างหรือไม่? นอกจากนี้ฉันกลัวว่าโซลูชันจะไม่ใช่ obvius สำหรับคนอื่น ๆ ที่แก้ไขไฟล์ org ...
ติมอร์

@timor ฉันได้นำการสนทนานี้ขึ้นในemacs-orgmode@gnu.orgรายการส่งเมล หากสนใจคุณสามารถทำตาม / สั่งการอภิปรายที่นี่
Kaushal Modi

@ ตัวจับเวลามันไม่ชัดเจน แต่สำหรับโซลูชันทั้งหมดที่ให้ไว้ที่นี่เป็นตัวเดียวที่ทำงานได้โดยไม่ต้องแก้ไขการกำหนดค่า emacs ดังนั้นจึงเป็นที่ชัดเจนที่สุดหากคุณต้องการแชร์ไฟล์ของคุณ
2699

@ user2699 FWIW การใช้เอนทิตี org ในไฟล์จะทำงานทันทีโดยไม่ต้องมีการกำหนดค่าผู้ใช้ .. มันเป็นเพียงการใช้ ascii ธรรมดา\ast{}ในไฟล์ โซลูชันอื่นของฉันทำให้\ast{}การจดจำเร็วขึ้นและง่ายขึ้น
Kaushal Modi

3

=*shrug*=โดยคำต่อคำถ้าคุณใช้งานจริงหมายถึงมาร์กอัปบางอย่างในน้ำยางส่งออกแล้วคุณก็สามารถใช้ แต่ถ้าคุณเพียงต้องการที่จะส่งออกเป็น*shrug*และคุณต้องการที่จะทำเช่นนี้ทุกครั้งที่ผมจะแนะนำให้ฟิลเตอร์ อย่างไรก็ตามหากคุณต้องการสิ่งนี้ในบางกรณี*shrug*คุณควรใช้ทางเลือกที่ @wvxvw แนะนำ คุณสามารถทำเช่นนี้ได้อย่างหมดจดโดยใช้แมโคร ตัวอย่างบางส่วนปฏิบัติตาม

ฟิลเตอร์

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

หลักกรองลักษณะดังกล่าวข้างต้นสำหรับ\textbf{..}มาร์กอัปในสตริงแปลงและแทนที่มันด้วยโดยไม่ต้องเปลี่ยนอะไรก็ตามที่ห่อภายใน\ast{}..\ast{} {..}ฉันไม่ได้ทดสอบนิพจน์ทั่วไปและสตริงการแทนที่ดังนั้นอาจมีข้อผิดพลาด แต่คุณเข้าใจ เช่นเดียวกับการครอบคลุมแบ็กเอนด์อื่น ๆ หนึ่งสามารถรวมตัวอย่างพิเศษเช่นนี้:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

ข้อแม้เดียวกันถือสำหรับการแสดงออกปกติข้างต้น

แมโคร

แหล่งที่มาขององค์กร:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

ส่งออกไปยัง LaTeX เป็น:

This text is \textbf{bold} this is \ast{}not\ast{}

และไปยัง HTML เป็น:

This text is <b>bold</b> this is  &#2a;not&#2a;

แน่นอนคุณสามารถเพิ่มแบ็กเอนด์ได้มากเท่าที่คุณต้องการในมาโคร

แก้ไข:ตามที่ Kaushal ชี้ให้เห็นในความคิดเห็นการส่งออกตัวอย่างสำหรับน้ำยางเป็นตัวเลือกในกรณีนี้ อย่างไรก็ตามฉันชอบที่จะใช้พวกเขาเมื่อใดก็ตามที่เกี่ยวข้องกับน้ำยางเปลือยเพราะฉันคิดว่ามันค่อนข้างยากที่จะติดตามรายการorg-entitiesและกฎเฉพาะที่ระบุไว้ข้างหลังการระบุน้ำยางเปลือยในแหล่ง Org

บันทึก:

  • ตัวอย่างตัวกรองยังไม่ได้ทดสอบ
  • ฉันไม่รู้อะไรเลยHTMLดังนั้นอาจมีข้อผิดพลาดบางอย่างในบิตที่เกี่ยวข้อง

ไม่ควรพอเพียงนี้นิยามแมโคร: #+macro: nobold \ast{}$1\ast{}? astเป็นหนึ่งในสมาชิกของorg-entitiesรายการที่ระบุว่าน้ำยาง, HTML, ASCII ฯลฯ ("ast" "\\ast" t "&lowast;" "*" "*" "*")การส่งออกควรมีลักษณะดังนี้: ลำดับขององค์ประกอบในรายการนั้นคือ "ชื่อ, การแทนที่ LaTeX, mathT LaTeX, การแทนที่ HTML, การแทนที่ ASCII, การแทนที่ Latin1, การแทนที่ utf-8"
Kaushal Modi

@kaushalmodi ใช่มันจะเป็นเช่นนั้น แต่เนื่องจากเรารู้ว่ามันคือ LaTeX จึงไม่มีอันตรายใด ๆ ที่จะนำมันเข้าไปในตัวอย่างของน้ำยาง จากประสบการณ์ของฉันในการใช้ตัวอย่างมีประสิทธิภาพมากขึ้นเนื่องจากความไม่น่าสงสัย
Quarky

-1

สิ่งนี้ถูกควบคุมโดยตัวแปร org-focus-alist และสามารถแก้ไขได้อย่างง่ายดาย

  • จุดวางเหนือข้อความตัวหนาคำสั่งการใช้สิ่งที่เคอร์เซอร์ตำแหน่งเพื่อค้นหาใบหน้าทราบว่ามันมีคุณสมบัติ C-u C-x =org-emphasis
  • โทรcustomize-groupและค้นหาองค์กรที่เน้น
  • ควรเน้นที่องค์กรด้วยตัวเลือกต่าง ๆ สำหรับการทำเครื่องหมายข้อความ
  • ลบรายการที่สอดคล้องกับ *
  • ใช้การเปลี่ยนแปลงและรีสตาร์ทโหมด org หรือ emacs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.