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.