Kuruluş modunu daha fazla işaretlemeyle genişletme


26

Bir işaretleme ve bu işaretleme için biçimlendirme eklemek istiyorum, yani <kbd>...</kbd>bir kutu ile bu işaretlemeyi çevreleyen. Ayrıca markanın uyumlu olmasını istiyorum (setq org-hide-emphasis-markers t). Diğer bir deyişle, değişken ayarlandığında t, <kbd>ve </kbd>etiketleri kaybolmalı ve metni yukarıda belirtilen biçimlendirme ile aralarında bırakmalıdır.

Bu sorunun gönderilmiş cevap: org modunda kalıcı metni vurgulamak nasıl gelmez yeni işaretlemeleri ile Org uzanan değil, mevcut işaretlemeleri için geçerlidir, çünkü bu sorunu çözmek.



1
@kaushalmodi Org bunu gördüğünde, org-hide-emphasis-markersbir kbdetiketin hızlı bir şekilde nasıl yerleştirileceğini değil , buna göre ve işaretlemenin gizlenebileceği bir şekilde metin özellikleri eklediğini gösteren bir işaret nasıl ekleneceğini sordum .
— Tu

1
Katılıyorum. Bunu kbd etiketleriyle ilgili olduğu için bir yorum olarak koyuyorum.
— Kaushal Modi


1
@ erikstokes bu çözüm yenileri için değil, sadece mevcut işaretlemeler için geçerlidir.
— Tu

Yanıtlar:


25

Benzer bir şey yaptım . Fransızca, ancak kodun kendisi için konuşması gerekiyor. Kullandığım ‰işaretleyici (Ben kullanmak için bepo düzenini) ve o zaman da, bir preslenmiş düğmeli tarzı olarak işaretlenmiş metni.

Ben lisp akıcı değilim, bu yüzden iyileştirme için oda olabilir.

Yaptığım şey, ‰işaretleyici için kullanırken , işaretlenmiş metnin basma düğme stiline sahip olması ve dışa aktarıldığında çevrilmesidir.<kbd>

İlk önce yeni bir yüz tanımladım:

(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)

Ardından özelleştirin 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

İhracat için, yük gerekebilir ox.elile (require 'ox).

Sonra her seferinde boldveya codebir işlevde (in ox-org.el) göründüğünde, benzer bir işlev (veya mevcut olanları değiştirdim) yarattım:

;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))))))

Sonra, my-htmldışa aktarma için bir arka uç tanımladım :

(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))

Bu yüzden kullandığım C-c C-e h rzaman doğru bir şekilde dışa aktarılıyor:

görüntü tanımını buraya girin

görüntü tanımını buraya girin

görüntü tanımını buraya girin

OP tarafından yorumlarda önerildiği gibi , tamponunuzu kullanmanız org-mode-restart(veya org-reload) veya öldürmeniz / yeniden yüklemeniz gerekebilir .


Düzenleme: Bu, önceki 8.3 sürümleriyle org-mode için çalışır (bu 8.2.10'a kadar)

.38.3.1 sürümleriyle değiştirmem gerekiyor

  • org eleman tüm nesneleri
  • muhtemelen org-element-object-kısıtlamaları
  • org-element - set regexpleri
  • org elemanı - nesne Lex

ve elbette yine de işlevleri ekleyin

  • org-element-my-nesne-tuş-ayrıştırıcı
  • org-element-my-nesne-tuş-tercüman

fakat

  • org eleman nesne ardıl-alist
  • org-element-metin-biçimlendirme-halefi

şimdi silindi.

Charles C. Berry'ye yardımları için teşekkürler .


Is %işaretleyici yerleşik bir one? En son Org ile çalışmasını sağlayamıyorum. Diğer kalemlere gelince, yüzlerini değiştirirsem iyi çalışır. Ancak gerçekten kendi belirteçlerimizi eklemenin bir yolu var mı? Bununla birlikte, cevabınız faydalıdır.
— Tu

%şu anda bir işaretleyici olarak kullanılmamaktadır. Benim kullandığım şekilde kullanabilirsiniz ‰. Olsa senin ikinci soruyu anlamadım ‰ olan yeni işaretleyici.
— fredtantini

Tamam, %işaretleyicinin çalışmasını sağlayabiliyordum ama koşmam gerekiyordu org-reload. Cevabı bu komutla güncellemelisin.
— Tu Do

Aslında ihtiyacımız yok org-reloadama org-mode-restart. Mesele şu ki, önceki Org tamponunu öldürmeliyiz ve değişikliğin yürürlüğe girmesi için yeni bir tane yaratmalıyız.
— Tu Do

İpuçları için teşekkürler. Cevabımı güncelledim. Yardım edebildiğime sevindim
— fredtantini

0

Yeni org modu işaretleme seçenekleri için işaretçi eklemek mümkün olduğunu sanmıyorum.

Bu 2012 yayınına göre, org-mode'un “vurgulayıcı işaretler zor kodlanacak” gibi görünüyor. İçin hızlı bir arama yapmak org-emph-reiçinde org.elaslında üretecek herhangi bir kod ortaya çıkmamasına org-emph-redan org-emphasis-alist. Buna bağlı olarak, org-emph-reeklediğiniz hiçbir şeyi aramayacağınıza göre org-emphasis-alist.

Bu benim tecrübemle uyumlu (Mevcut vurgu işaretlerini yeniden tanımlayabilirim, ancak tanıma |ya &da tanıma org-modunu alamadım H).

Burada uzman değilim, yine de yanlış olduğumu öğrenmek isterim :)


1
Basitçe düzenleme org-emphasis-alist, yeni bir işaretleyici eklemeyecek. Ek olarak da çalışmak zorundasınız org-font-lock-extra-keywords. Bu cevap çalışan bir çözüm sunar.
— Dean Seo,

Hey, işe yarıyor! En azından aynı etkiyi yaratıyor! :) Biri kullandığında, org-font-lock-extra-keywordso zaman birinin değişmesi gerekmez org-emphasis-alist, açıkça ( org-font-lock...Kodu ekledim ama değişmedi org-emphasis-alistve şimdi işler biçimlendirildi)
— MikeTheTall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.