คำต่อคำแบบอินไลน์และโค้ดพร้อมเครื่องหมายคำพูดในโหมดองค์กร


37

ในโหมด Org ฉันสามารถล้อมข้อความด้วย=หรือ~เพื่อวางข้อความในinline verbatim หรือ code mode

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

ตัวอย่างเช่น:

  • =hello= แสดงผลเป็นคำต่อคำ
  • ~hello~ แสดงผลเป็นรหัส
  • =hello'= ไม่สามารถแสดงผลเป็นคำต่อคำ
  • ~hello'~ ไม่สามารถแสดงผลเป็นรหัสได้

ทางออกเดียวที่ฉันพบจนถึงตอนนี้คือการใส่ตัวอักษรที่มองไม่เห็นเช่นการพิมพ์C-x 8 <RET> 200b <RET>ตามที่อธิบายไว้ในคำถามนี้

ทำไมนี่ (มันเป็นข้อผิดพลาด?) และฉันจะหลีกเลี่ยงปัญหานี้ได้อย่างไรโดยไม่ต้องใส่ตัวอักษรที่มองไม่เห็น?

คำตอบ:


47

ก่อนอื่น: นี่คือ Emacs มันไม่ใช่ข้อผิดพลาดมันเป็นการตั้งค่า!

ประการที่สอง @glucas พูดถูกต้องว่าคุณต้องแก้ไขorg-emphasis-regexp-componentsเพื่อให้ได้สิ่งที่คุณต้องการ อย่างไรก็ตามฉันต้องการแนะนำการแก้ไขสองรหัส (@ Malabarba's) รหัสของเขาและให้บริบทเพิ่มเติมอีกเล็กน้อย:

  1. คุณไม่จำเป็นต้องคัดลอกค่าทั้งหมดของorg-emphasis-regexp-componentsไปยังไฟล์ init ของคุณเพื่อแก้ไขส่วนประกอบเดียว สำหรับกรณีการใช้งานของคุณมีดังต่อไปนี้:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\r\n,\"")
  2. คุณไม่ต้องแก้ไขorg-emphasis-regexp-componentsก่อนที่จะโหลดผ่านorg-mode (require 'org)เพียงเพิ่มบรรทัดต่อไปนี้หลังจากการแก้ไขของคุณ:

    (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

บริบทเพิ่มเติม

ในกรณีที่คุณต้องการปรับแต่งแง่มุมอื่น ๆ ของการทำงานของมาร์กอัปเน้นให้org-modeรู้สิ่งนี้:

ค่าของorg-emphasis-regexp-componentsคือรายการที่มีห้ารายการ

  1. รายการแรกควบคุมว่าอักขระใดที่ได้รับอนุญาตให้นำหน้าอักขระมาร์กอัปทันที หากคุณต้องการให้มีสิ่งที่why=hello=แสดงอย่างถูกต้องคุณจะต้องแก้ไขรายการนี้

    (setcar org-emphasis-regexp-components "...")
  2. รายการที่สองควบคุมว่าอักขระใดที่ได้รับอนุญาตให้ติดตามอักขระมาร์กอัปทันที หากคุณต้องการให้มีสิ่งที่=hello=thereแสดงอย่างถูกต้องคุณจะต้องแก้ไขรายการนี้

    (setcar (nthcdr 1 org-emphasis-regexp-components) "...")
  3. รายการที่สามระบุอักขระที่ไม่ได้รับอนุญาตให้ใช้เป็นอักขระเส้นขอบกล่าวคืออักขระที่ตามหลังอักขระมาร์กอัปเปิดหรือนำหน้าอักขระมาร์กอัปปิด คุณจะต้องแก้ไขสิ่งนี้เพื่อให้สิ่งต่าง ๆ เช่นการ='hello'=แสดงผลถูกต้อง

    (setcar (nthcdr 2 org-emphasis-regexp-components) "...")
  4. รายการที่สี่แสดงตัวอักษรที่ได้รับอนุญาตในเนื้อความของสตริงที่ทำเครื่องหมายไว้ของคุณเช่นตัวละครที่ปรากฏระหว่างอักขระเส้นขอบ คุณแทบจะไม่ต้องแก้ไขสิ่งนี้ โดยค่าเริ่มต้นตัวละครใด ๆ ที่ได้รับอนุญาตให้เป็นตัวละคร

    (setcar (nthcdr 3 org-emphasis-regexp-components) "...")
  5. รายการที่ห้าระบุจำนวนบรรทัดใหม่ที่ได้รับอนุญาตภายในนิพจน์ที่ทำเครื่องหมายไว้ โดยค่าเริ่มต้นorg-modeอนุญาตให้ขึ้นบรรทัดใหม่เดียว ดังนั้นหากคุณต้องการเพิ่มมาร์กอัพให้กับข้อความที่ครอบคลุมมากกว่าสองบรรทัดติดต่อกันคุณจะต้องแก้ไขรายการนี้

    (setcar (nthcdr 4 org-emphasis-regexp-components) N)

    ... Nคือจำนวนบรรทัดใหม่ที่คุณต้องการอนุญาต

กระทู้ที่เกี่ยวข้อง

ผู้คนดูเหมือนจะพบปัญหานี้บ่อยครั้ง นอกเหนือจากโพสต์ที่คุณพูดถึงมีคำถามเพิ่มเติมอย่างน้อยสองคำถามเกี่ยวกับ StackOverflow ที่จัดการกับปัญหาที่คล้ายกันมาก:


7
ฉันยกระดับคำตอบของคุณ แต่อยากจะยกย่องคุณภาพของคำตอบ
Kaushal Modi

ขอบคุณ @itsjeyd วิธีนี้ใช้งานได้ดีถ้าฉันเรียกใช้สองบรรทัดเหล่านั้นแบบโต้ตอบได้เมื่อ Emacs ได้โหลดเต็มพร้อมกับบัฟเฟอร์ที่เปิดอยู่แล้ว อย่างไรก็ตามและแปลกพอฉันพบ"Symbol's value as variable is void: org-emphasis-regexp-components"แม้ว่าฉันจะวางสองบรรทัดเหล่านั้นตลอดทางที่ด้านล่างของ.emacsไฟล์ของฉัน มีความคิดเห็นเกี่ยวกับสาเหตุที่เป็นเช่นไร?
Amelio Vazquez-Reina

@ AmelioVazquez-Reina ยินดีต้อนรับคุณ :) เพื่อให้แน่ใจว่า: คุณ(require 'org)อยู่ใน.emacsไฟล์ของคุณก่อนทำการปรับแต่งใด ๆorg-emphasis-regexp-componentsหรือไม่?
itsjeyd

1
@ AmelioVazquez-Reina ฉันดีใจที่ทุกอย่างทำงานได้อย่างถูกต้องสำหรับคุณตอนนี้ :) การสังเกตของคุณถูกต้อง - คุณไม่จำเป็นต้อง(require 'org)ใช้ไฟล์ init เพื่อใช้งาน หากคุณทำไม่ได้ Emacs จะโหลดโดยอัตโนมัติเมื่อคุณ: (a) เปิด.orgไฟล์เป็นครั้งแรกในเซสชันปัจจุบันหรือ (b) เปิดใช้งานโหมดด้วยตนเองผ่านM-x org-modeเป็นครั้งแรกในเซสชันปัจจุบันหรือ (c) ) เมื่อมันกู้คืนเดสก์ท็อปที่บันทึกซึ่งมี.orgไฟล์อย่างน้อยหนึ่งไฟล์ (ต่อ)
itsjeyd

1
@ AmelioVazquez-Reina (ต่อ) สิ่งนี้คือ : Emacs จะไม่โหลดorg-modeโดยอัตโนมัติเพียงเพราะคุณใส่การปรับแต่งบางอย่างไว้ในไฟล์ init ของคุณ นั่นเป็นเหตุผลที่คุณจำเป็นต้อง(require 'org)ปรับแต่งตัวแปรก่อน โดยไม่ต้องโหลดโหมด Emacs จะไม่ทราบว่าจะทำอย่างไรกับตัวแปรเช่นorg-emphasis-regexp-components; พวกเขาจะไม่ถูกกำหนดเมื่อ Emacs พบพวกเขาครั้งแรกดังนั้นSymbol's value as variable is voidข้อความ
itsjeyd

11

มีตัวเลือกที่ง่ายกว่ามาก: ใช้บล็อคแหล่งข้อมูลแบบอินไลน์ :

src_python{hello'}

สิ่งนี้ใช้ได้โดยไม่มีปัญหาสำหรับตัวอักษรเช่นเครื่องหมายคำพูดและให้การเน้นไวยากรณ์สำหรับรหัสแบบอินไลน์

หากต้องการรวมซอร์สโค้ดแบบอินไลน์เมื่อส่งออกคุณจะต้องเพิ่มการประกาศนี้ในส่วนหัว:

#+PROPERTY: header-args :exports code

1
นี่เป็นเคล็ดลับที่ยอดเยี่ยม! ดีมากที่จะได้รับการเน้นไวยากรณ์สำหรับรหัสแบบอินไลน์!
Shon

มันเยี่ยมมาก! มันทำให้ฉันนึกถึงลาเท็กซ์ (:
Chris.Q

7

คุณสามารถลบเครื่องหมายคำพูดออกจากorg-emphasis-regexp-componentsที่อธิบายโดย @Malabarba ในโพสต์บล็อกนี้

รหัสที่เกี่ยวข้องจากโพสต์นั้น:

;; This HAS to come before (require 'org)
(setq org-emphasis-regexp-components
      '("     ('\"{“”"
        "-   .,!?;''“”\")}/\\“”"
        "    \r\n,"
        "."
        1))

ดูที่สตริงเอกสารสำหรับorg-emphasis-regexp-components: โดยค่าเริ่มต้นจะพิจารณาอักขระอ้างคำพูด

border - ตัวอักษรต้องห้ามเป็นอักขระเส้นขอบ

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