अधिक मार्कअप के साथ ऑर्ग-मोड का विस्तार


26

मैं एक मार्कअप जोड़ना चाहता हूं और इस तरह के मार्कअप के लिए प्रारूपण करना चाहता हूं, जैसे <kbd>...</kbd>कि एक बॉक्स ऐसे मार्कअप के चारों ओर होता है। मैं यह भी चाहता हूं कि मार्क के साथ संगत हो (setq org-hide-emphasis-markers t)। यही है, जब चर सेट किया जाता है t, <kbd>और </kbd>टैग गायब हो जाना चाहिए, इसके बीच पाठ को ऊपर निर्दिष्ट प्रारूपण के साथ छोड़ देना चाहिए।

इस प्रश्न में पोस्ट किया गया उत्तर: ऑर्ग-मोड में टेक्स्ट को स्थायी रूप से कैसे हाइलाइट करना है, इस समस्या को हल नहीं करता है, क्योंकि यह केवल मौजूदा मार्कअप के लिए लागू होता है, ऑर्ग को नए मार्कअप के साथ विस्तारित नहीं करता है।



1
@kaushalmodi मैंने पूछा कि एक चिह्न कैसे जोड़ा जाता है कि जब ऑर्ग इसे देखता है, तो यह तदनुसार पाठ गुण जोड़ता है और इस तरह से कि मार्कअप को छिपाया जा सकता है org-hide-emphasis-markers, न कि कैसे जल्दी से एक kbdटैग सम्मिलित करने के लिए।
Tu Do

1
मैं सहमत हूँ। मैंने इसे एक टिप्पणी के रूप में रखा क्योंकि यह केबीडी टैग से संबंधित था।
कौशल मोदी


1
@erikstokes कि समाधान केवल मौजूदा मार्कअप के लिए लागू है, नए नहीं।
Tu Do

जवाबों:


25

मैंने भी कुछ ऐसा ही किया है । यह फ्रेंच में है, लेकिन कोड खुद के लिए बोलना चाहिए। मैं मार्कर के लिए उपयोग करता हूं (मैं बीप लेआउट का उपयोग करता हूं ), और जब मैं करता हूं, तो एक दबाए गए बटन शैली के रूप में चिह्नित पाठ।

मैं लिस्प में धाराप्रवाह नहीं हूं, इसलिए सुधार के लिए जगह हो सकती है।

मैंने जो किया है, मार्कर के लिए उपयोग करते समय , चिह्नित पाठ में एक दबाया गया बटन शैली है, और जब निर्यात किया जाता है तो इसका अनुवाद किया जाता है<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करता हूं तो इसे सही तरीके से निर्यात किया जाता है:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

जैसा कि टिप्पणियों में ओपी द्वारा सुझाया गया है, आपको अपने बफर का उपयोग org-mode-restart(या org-reload) या मारने / पुनः लोड करने की आवश्यकता हो सकती है ।


संपादित करें: यह 8.3 से पहले के संस्करणों वाले ऑर्ग-मोड के लिए काम करता है (जो 8.2.10 तक है)

संस्करणों .8.3.1 के साथ, मुझे संशोधित करना होगा

  • org-तत्व-सभी वस्तुओं
  • संभवतः org- तत्व-वस्तु-प्रतिबंध
  • org-तत्व - सेट regexps
  • org-तत्व - वस्तु लेक्स

और निश्चित रूप से अभी भी कार्यों को जोड़ते हैं

  • org-तत्व-मेरी-वस्तु कीस्ट्रोक-पार्सर
  • org-तत्व-मेरी-वस्तु कीस्ट्रोक-दुभाषिया

परंतु

  • org-तत्व वस्तु उत्तराधिकारी-alist
  • org-तत्व-पाठ मार्कअप-उत्तराधिकारी

अब हटा दिए गए हैं।

उनकी मदद के लिए चार्ल्स सी। बेरी को धन्यवाद ।


क्या %मार्कर एक बिल्ट-इन है? मैं नवीनतम Org के साथ काम करने के लिए इसे प्राप्त नहीं कर सकता। अन्य मार्करों की तरह, यह ठीक काम करता है अगर मैं उनके चेहरे को बदलता हूं। लेकिन क्या वास्तव में हमारे अपने मार्करों को जोड़ने का कोई तरीका है? फिर भी, आपका उत्तर उपयोगी है।
तू क्या

%वर्तमान में एक मार्कर के रूप में उपयोग नहीं किया जाता है। आप इसे उसी तरह इस्तेमाल कर सकते हैं जैसे मैंने इस्तेमाल किया था । मैं अपने दूसरे प्रश्न समझ में नहीं आता है, है एक नया मार्कर।
फर्दांतिनी

ठीक है, मैं %मार्कर काम करने में सक्षम था , लेकिन मुझे भागना पड़ा org-reload। आपको उस कमांड के साथ उत्तर को अपडेट करना चाहिए।
तू डू

असल में, हम की जरूरत नहीं है org-reload, लेकिन org-mode-restart। बात यह है कि, हमें पिछले ऑर्ग बफर को मारना होगा और परिवर्तन को प्रभावी करने के लिए एक नया बनाना होगा।
तू क्या

सुझावों के लिए धन्यवाद। मैंने अपना उत्तर अपडेट कर दिया है। खुशी है कि मैं मदद कर सकता हूँ
fredtantini

0

मुझे नहीं लगता कि नए org- मोड मार्कअप विकल्पों के लिए मार्कर जोड़ना संभव है।

2012 के इस पोस्ट के अनुसार यह ऑर्ग-मोड के "जोर मार्करों को हार्ड-कोडित किया जाएगा" जैसा दिखता है। के लिए एक त्वरित खोज कर org-emph-reमें org.elकिसी भी कोड है कि वास्तव में उत्पन्न होगा खुलासा नहीं करता है org-emph-reसे org-emphasis-alist। इसके आधार पर ऐसा लगता है org-emph-reकि आप जो कुछ भी जोड़ना चाहते हैं , उसे खोज नहीं पाएंगे org-emphasis-alist

यह मेरे अनुभव के अनुरूप है (मैं मौजूदा जोर मार्करों को फिर से परिभाषित कर सकता हूं, लेकिन पहचान |या &या करने के लिए ओआरजी-मोड नहीं मिल सकता है H)।

मैं यहाँ एक विशेषज्ञ नहीं हूँ, हालाँकि, और यह जानना पसंद करूँगा कि मैं गलत हूँ :)


1
बस संपादन org-emphasis-alistएक नया मार्कर नहीं जोड़ेंगे। आपको अतिरिक्त रूप से org-font-lock-extra-keywordsभी काम करना होगा । यह उत्तर एक कार्यशील समाधान देता है।
डीन एसईओ

अरे, वह काम करता है! कम से कम, कि एक ही प्रभाव को प्राप्त होता है! :) जब कोई एक का उपयोग करता है org-font-lock-extra-keywordsतो उसे बिल्कुल बदलने की आवश्यकता नहीं होती है org-emphasis-alist, (मैंने org-font-lock...कोड जोड़ा लेकिन मेरा बदलाव नहीं हुआ org-emphasis-alistऔर अब चीजें स्वरूपित हो रही हैं)
माइक इन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.