การขยายโหมดองค์กรด้วยมาร์กอัปเพิ่มเติม


26

ฉันต้องการเพิ่มมาร์กอัปและการจัดรูปแบบสำหรับมาร์กอัปนั้นเช่น<kbd>...</kbd>มีกล่องล้อมรอบมาร์กอัปดังกล่าว (setq org-hide-emphasis-markers t)ฉันยังต้องการเครื่องหมายขึ้นเพื่อเป็นที่เข้ากันได้กับ นั่นคือเมื่อตัวแปรมีการตั้งค่าtที่<kbd>และ</kbd>แท็กจะหายไปทิ้งข้อความระหว่างมันกับที่ระบุไว้ข้างต้นการจัดรูปแบบ

คำตอบที่โพสต์ในคำถามนี้: วิธีการเน้นข้อความอย่างถาวรในโหมดองค์กร ไม่สามารถแก้ปัญหานี้ได้เนื่องจากมันจะใช้ได้เฉพาะกับมาร์กอัปที่มีอยู่เท่านั้นไม่ขยาย Org ด้วยมาร์กอัปใหม่



1
@kaushalmodi ฉันถามว่าจะเพิ่มเครื่องหมายได้อย่างไรเมื่อองค์กรเห็นมันจะเพิ่มคุณสมบัติข้อความตามนั้นและในลักษณะที่มาร์คอัปสามารถซ่อนด้วยorg-hide-emphasis-markersไม่ใช่วิธีแทรกkbdแท็กอย่างรวดเร็ว
Tu Do

1
ฉันเห็นด้วย. ฉันใส่สิ่งนี้เป็นความคิดเห็นเนื่องจากเกี่ยวข้องกับแท็ก kbd
Kaushal Modi


1
@erikstoke โซลูชันนั้นใช้ได้กับมาร์กอัปที่มีอยู่เท่านั้นไม่ใช่โซลูชันใหม่
Tu Do

คำตอบ:


25

ฉันได้ทำบางสิ่งบางอย่างที่คล้ายกัน มันเป็นภาษาฝรั่งเศส แต่รหัสควรพูดด้วยตัวของมันเอง ฉันใช้สำหรับเครื่องหมาย (ฉันใช้เลย์เอาต์ bepo ) และเมื่อฉันทำข้อความที่ทำเครื่องหมายว่าเป็นรูปแบบปุ่มกด

ฉันไม่คล่องแคล่วในเสียงกระเพื่อมดังนั้นอาจมีที่ว่างสำหรับการปรับปรุง

สิ่งที่ฉันทำคือเมื่อใช้สำหรับตัวทำเครื่องหมายข้อความที่ทำเครื่องหมายจะมีลักษณะเป็นปุ่มกดและเมื่อส่งออกแล้วจะถูกแปลเป็น<kbd>

ก่อนอื่นฉันต้องกำหนดหน้าใหม่:

(defface my-face-org-keystroke
  '((t (:inherit shadow 
        :box (:line-width -2 ;neg. in order to keep the same size of lines
              :color "grey75"
              :style pressed-button)))) "Face for keystrokes"
        :group 'org-faces)

จากนั้นปรับแต่ง org-emphasis-alist:

(("*" bold)
 ("/" italic)
 ("_" underline)
 ("=" org-code verbatim)
 ("~" org-verbatim verbatim)
 ("+"
  (:strike-through t))
 ("‰" my-face-org-keystroke verbatim));This line is what you want to add

เพื่อการส่งออกคุณอาจจำเป็นต้องโหลดด้วยox.el(require 'ox)

จากนั้นทุกครั้งboldหรือcodeปรากฏในฟังก์ชั่น (ในox-org.el) ฉันได้สร้างฟังก์ชั่นที่คล้ายกัน (หรือแก้ไขที่มีอยู่):

;creation
(defun org-html-keystroke (keystroke contents info)
  "Transcode KEYSTROKE from Org to HTML.
CONTENTS is nil.  INFO is a plist holding contextual
information."
  (format (or (cdr (assq 'my-object-keystroke org-html-text-markup-alist)) "%s")
          (org-html-encode-plain-text (org-element-property :value keystroke))))


;creation
(defun org-element-my-object-keystroke-parser ()
  "Parse code object at point.

Return a list whose CAR is `my-object-keystroke' and CDR is a plist with
`:value', `:begin', `:end' and `:post-blank' keywords.

Assume point is at the first tilde marker."
  (interactive)
  (save-excursion
    (unless (bolp) (backward-char 1))
    (looking-at org-emph-re)
    (let ((begin (match-beginning 2))
          (value (org-match-string-no-properties 4))
          (post-blank (progn (goto-char (match-end 2))
                             (skip-chars-forward " \t")))
          (end (point)))
      (list 'my-object-keystroke
            (list :value value
                  :begin begin
                  :end end
                  :post-blank post-blank)))))

;creation
(defun org-element-my-object-keystroke-interpreter (keystroke contents)
  "Interpret KEYSTROKE object as Org syntax.
CONTENTS is nil."
  (format "‰%s‰" (org-element-property :value keystroke)))


;modification
(defconst org-element-object-successor-alist
  '((subscript . sub/superscript) (superscript . sub/superscript)
    (bold . text-markup) (code . text-markup) (italic . text-markup)
    (strike-through . text-markup) (underline . text-markup)
    (verbatim . text-markup) (entity . latex-or-entity)
    (latex-fragment . latex-or-entity) (my-object-keystroke . text-markup))
  "Alist of translations between object type and successor name.
Sharing the same successor comes handy when, for example, the
regexp matching one object can also match the other object.")

;modification
(defconst org-element-all-objects
  '(bold code entity export-snippet footnote-reference inline-babel-call
         inline-src-block italic line-break latex-fragment link macro
         radio-target statistics-cookie strike-through subscript superscript
         table-cell target timestamp underline verbatim my-object-keystroke)
  "Complete list of object types.")


;modification
(defun org-element-text-markup-successor ()
  "Search for the next text-markup object.

Return value is a cons cell whose CAR is a symbol among `bold',
`italic', `underline', `strike-through', `code' and `verbatim'
and CDR is beginning position."
  (save-excursion
    (unless (bolp) (backward-char))
    (when (re-search-forward org-emph-re nil t)
      (let ((marker (match-string 3)))
        (cons (cond
               ((equal marker "*") 'bold)
               ((equal marker "/") 'italic)
               ((equal marker "_") 'underline)
               ((equal marker "+") 'strike-through)
               ((equal marker "~") 'code)
               ((equal marker "=") 'verbatim)
               ((equal marker "‰") 'my-object-keystroke) 
               (t (error "Unknown marker at %d" (match-beginning 3))))
              (match-beginning 2))))))

ถัดไปฉันได้กำหนดmy-htmlแบ็กเอนด์สำหรับการส่งออก:

(org-export-define-derived-backend 'my-html 'html
  :translate-alist '((my-object-keystroke . org-html-keystroke))
  :menu-entry ' (?h 1
                    ((?r "my-html"  org-html-export-to-my-html))))

(defun org-html-export-to-my-html
  (&optional async subtreep visible-only body-only ext-plist)
  "Export current buffer to a HTML file.

Return output file's name."
  (interactive)
  (let* ((extension (concat "." org-html-extension))
         (file (org-export-output-file-name extension subtreep))
         (org-export-coding-system org-html-coding-system))
    (org-export-to-file 'my-html file
      async subtreep visible-only body-only ext-plist)))


(defun org-html-publish-to-my-html (plist filename pub-dir)
  "Publish an org file to my-html.
Return output file name."
  (org-publish-org-to 'my-html filename
                      (concat "." (or (plist-get plist :html-extension)
                                      org-html-extension "html"))
                      plist pub-dir))

(defun org-html-convert-region-to-my-html ()
  "Assume the current region has org-mode syntax, and convert it to HTML.
This can be used in any buffer.  For example, you can write an
itemized list in org-mode syntax in an HTML buffer and use this
command to convert it."
  (interactive)
  (org-export-replace-region-by 'my-html))

ดังนั้นเมื่อฉันใช้C-c C-e h rมันส่งออกอย่างถูกต้อง:

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

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

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

ตามคำแนะนำของ OP ในความคิดเห็นคุณอาจต้องใช้org-mode-restart(หรือorg-reload) หรือฆ่า / โหลดบัฟเฟอร์ของคุณใหม่


แก้ไข: ใช้งานได้กับโหมดองค์กรที่มีเวอร์ชันก่อน 8.3 (นั่นคือจนถึง 8.2.10)

ด้วยเวอร์ชั่น≥8.3.1ฉันต้องแก้ไข

  • org องค์ประกอบทั้งหมดวัตถุ
  • อาจเป็นข้อ จำกัด ขององค์ประกอบองค์ประกอบวัตถุ
  • org องค์ประกอบ - ชุด regexps
  • org องค์ประกอบ - วัตถุแนนเชี่ยล

และแน่นอนยังคงเพิ่มฟังก์ชั่น

  • org องค์ประกอบของฉัน-วัตถุการกดแป้นพิมพ์-parser
  • org องค์ประกอบของฉัน-วัตถุการกดแป้นพิมพ์ล่าม

แต่

  • org-องค์ประกอบวัตถุสืบทอด alist
  • org-องค์ประกอบข้อความมาร์กอัป-ทายาท

ถูกลบแล้ว

ขอบคุณCharles C. Berryสำหรับความช่วยเหลือของเขา


เป็น%เครื่องหมายในตัวเดียว? ฉันไม่สามารถทำงานกับองค์กรล่าสุดได้ สำหรับเครื่องหมายอื่น ๆ มันใช้งานได้ดีถ้าฉันเปลี่ยนใบหน้า แต่มีวิธีเพิ่มเครื่องหมายของเราเองจริง ๆ หรือไม่ อย่างไรก็ตามคำตอบของคุณมีประโยชน์
Tu Do

%ไม่ได้ใช้เป็นเครื่องหมาย คุณสามารถใช้วิธีเดียวกันกับที่ผมใช้ ฉันไม่เข้าใจคำถามที่สองของคุณ แต่ เป็นเครื่องหมายใหม่
fredtantini

ตกลงฉันก็สามารถที่จะทำให้%การทำงานเครื่องหมาย org-reloadแต่ผมต้องวิ่ง คุณควรอัพเดตคำตอบด้วยคำสั่งนั้น
Tu Do

อันที่จริงเราไม่จำเป็นต้องแต่org-reload org-mode-restartสิ่งนี้คือเราจะต้องฆ่า Org buffer ก่อนหน้านี้และสร้างอันใหม่เพื่อให้การเปลี่ยนแปลงมีผล
Tu Do

ขอบคุณสำหรับเคล็ดลับ ฉันได้อัพเดตคำตอบแล้ว ดีใจที่ฉันสามารถช่วย
fredtantini

0

ฉันไม่คิดว่าเป็นไปได้ที่จะเพิ่มเครื่องหมายสำหรับตัวเลือกมาร์กอัปโหมดองค์กรใหม่

ตามที่โพสต์ 2012 นี้ดูเหมือนว่า "เครื่องหมายเน้นจะเป็นรหัสยาก" ของโหมด org ทำการค้นหาอย่างรวดเร็วสำหรับorg-emph-reในorg.elไม่เปิดเผยรหัสใด ๆ ที่จริงจะสร้างจากorg-emph-re org-emphasis-alistขึ้นอยู่กับว่ามันดูเหมือนว่าจะไม่ได้ค้นหาสิ่งที่คุณเพิ่ม org-emph-reorg-emphasis-alist

สิ่งนี้สอดคล้องกับประสบการณ์ของฉัน (ฉันสามารถกำหนดเครื่องหมายเน้นที่มีอยู่ใหม่ได้ แต่ไม่สามารถรับโหมด org เพื่อรับรู้|หรือ&หรือH)

แม้ว่าฉันไม่ใช่ผู้เชี่ยวชาญที่นี่และชอบที่จะรู้ว่าฉันผิด :)


1
เพียงแก้ไขorg-emphasis-alistจะไม่เพิ่มเครื่องหมายใหม่ คุณต้องทำงานเพิ่มเติมด้วยorg-font-lock-extra-keywordsเช่นกัน คำตอบนี้ให้ทางออกที่ทำงาน
Dean Seo

เฮ้นั่นมันได้ผล! อย่างน้อยก็บรรลุผลเช่นเดียวกัน! :) เมื่อมีคนใช้org-font-lock-extra-keywordsแล้วไม่จำเป็นต้องเปลี่ยนorg-emphasis-alistเลยเห็นได้ชัด (ฉันเพิ่มorg-font-lock...รหัส แต่ไม่ได้เปลี่ยนorg-emphasis-alistรูปแบบของฉันและตอนนี้สิ่งที่กำลังจัดรูปแบบ)
MikeTheTall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.