Emacs'ta Markdown'un SE lezzetini nasıl kullanabilirim?


17

EMAC'lerimde SE etiketleme lezzetini kullanmak istiyorum. Varsayılan Markdown modu bazı özellikleri (backticks ve girinti işareti kodu, #bir başlık yapar ve >ayrıca yazı tipini değiştirir) vardır ama ben de istiyorum:

  • * girinti dahil bir liste öğesi yapmak için.
  • [foo](http://example.com)foo olarak görünür ve http://example.comtıklandığında bir tarayıcı açar .

İdeal olarak, bunun emaclarımda Markdown olarak gösterilmesini istiyorum. Örneğin, eğer yazacak olsaydım:

## Header

* item 1
* item 2

         while true; do echo foo; done

End of list and more code

    while true; do echo bar; done

 See [here](http://example.com) for details

Emacs'ın kendisinde böyle işlenmesini istiyorum:


Başlık

  • madde 1
  • madde 2

    while true; do echo foo; done
    

Liste sonu ve daha fazla kod

while true; do echo bar; done

Ayrıntılar için buraya bakın


Bu gerçekleştirilebilir mi, eğer öyleyse, nasıl?


Oluşturulan kod bloğu hakkında: Markdown modu sizin için kod bloklarını vurgulamıyor mu? Orada ne arıyordun?
Malabarba

Ayrıca, bunun bir WYSIWYG Markdown düzenleyicisi gibi düzenlenebilir olmasını ister misiniz? Yoksa "derlenmiş" çıktıyı ayrı bir tamponda görüntülemek yeterli mi? İkincisi oldukça basit, birincisi kodlayan bir devdir.
Malabarba

@Malabarba, evet, kod iyi. Ne istiyorum i) otomatik girintili listeler ii) url işleme. Ya xdg-opentıklandığında hedef adres üzerinden ya da sadece basitçe görüntüleniyor, ancak değilken bağlantı metni görüntüleniyor: Tıklandığında olmak için "buraya tıklayın " Click [here](http://example.com). URL'leri metin belgelerime sorunsuz bir şekilde eklemenin hızlı bir yolu.
terdon

Tamam, her ikisine de font-lock-add-keyword ile ulaşılabilir. Kimse beni yenemezse yarın bir şeyler yazmaya çalışacağım.
Malabarba

Yanıtlar:


19

** DÜZENLEME: ** Bu yazıdan beri, özelliklerin bir kısmı doğrudan işaretleme modunda uygulanmış gibi görünüyor. Bu yorumu ve içindeki bağlantıları kontrol edin .


Yapılandırma

Uygulayabileceğiniz iki yaklaşım vardır.

  1. İşaretleme kodunu derleyen bir komut yazabilirsiniz (bir kabuk komutu kullanarak) ve html'yi bir arabellekte görüntüler.
  2. Arabellek işlenmiş işaretleme gibi görünmesi için bazı özelleştirmeleri a-la org-mode yapabilirsiniz .

Burada 2 numarasının nasıl uygulanacağını açıklıyorum. Aşağıdaki tüm kodları init dosyasına kopyalamanız yeterli.

Yazı tipi kilidi kurallarını ekleyin

Bu değişken, listelerin nasıl görünmesini istediğinizi denetler. Listeye girinti eklemek için biraz boşluk ekler ve güzel bir madde işareti kullanır (yazı tipiniz görüntüleyebiliyorsa).

(defvar endless/bullet-appearance
  (propertize (if (char-displayable-p ?•) "  •" "  *")
              'face 'markdown-list-face)
  "String to be displayed as the bullet of markdown list items.")

Bu, kuralları gerçekten ekleyen komuttur. Listeler için bir ve bağlantılar için bir tane var.

(require 'rx)
(defvar endless/markdown-link-regexp
    "\\[\\(?1:[^]]+\\)]\\(?:(\\(?2:[^)]+\\))\\|\\[\\(?3:[^]]+\\)]\\)"
  "Regexp matching a markdown link.")

(font-lock-add-keywords
 'markdown-mode
 '(("^ *\\(\\*\\|\\+\\|-\\|\\) "
    1 `(face nil display ,endless/bullet-appearance) prepend)
   (endless/markdown-link-regexp
    1 '(face nil display "") prepend))
 'append)

Bağlantıyı düzenlenebilir hale getirme

displayÖzelliği bağlantının bir kısmını gizlemek için kullandığımız için , font kilidine bağlantının bir bölümünü her sildiğinizde bu özelliği silmesi gerektiğini söylemeliyiz (bu şekilde yine de düzenleyebiliriz).

(add-hook 'markdown-mode-hook #'endless/markdown-font-lock)

(defun endless/markdown-font-lock ()
  "Configure aggressive font-locking of `markdown-mode'."
  (define-key markdown-mode-map "\C-c\C-l" #'endless/markdown-insert-link)
  (add-to-list (make-local-variable 'font-lock-extra-managed-props) 'display))

Ayrıca C-c C-l, org modunda olduğu gibi, kolayca düzenlemek için bağlı bir komut tanımlayabiliriz .

(defun endless/markdown-insert-link ()
  "Insert or edit link at point."
  (interactive)
  (if (or (looking-at endless/markdown-link-regexp)
          (and (ignore-errors (backward-up-list) t)
               (or (looking-at endless/markdown-link-regexp)
                   (and (forward-sexp -1)
                        (looking-at endless/markdown-link-regexp)))))
      (let ((data (endless/ask-for-link
                   (match-string-no-properties 1) 
                   (or (match-string-no-properties 2)
                       (match-string-no-properties 3)))))
        (if (match-string-no-properties 2)
            (replace-match (cdr data) :fixedcase :literal nil 2)
          (replace-match (cdr data) :fixedcase :literal nil 3))
        (replace-match (car data) :fixedcase :literal nil 1))
    (let ((data (endless/ask-for-link)))
      (insert "[" (car data) "](" (cdr data) ")"))))

(defun endless/ask-for-link (&optional name link)
  (cons (read-string "Text of the link: " name)
        (read-string "URL of the link: " link)))

(İsteğe bağlı) Bazı yüzleri yapılandırma

Bu, talep ettiğiniz puanlar için yeterli olmalıdır. Eğer tampon görünmek istiyorsanız daha GD markdown, çağrısı gibi

M-x customize-group RET markdown-faces

ve uygun gördüklerinizi değiştirin. Kendimi yapılandırarak yaptım ve işte elimde olan şey bu.

(custom-set-faces
 '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
 '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.7))))
 '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.4))))
 '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.1))))
 '(markdown-inline-code-face ((t (:inherit font-lock-constant-face :background "gainsboro"))))
 '(markdown-link-face ((t (:inherit link))))
 '(markdown-pre-face ((t (:inherit font-lock-constant-face :background "gainsboro")))))

Sonuçlar

İlk 2 yapılandırmadan sonra ne elde edeceğiniz aşağıda açıklanmıştır:
resim açıklamasını buraya girin

Yüzleri yapılandırdıktan sonra da ne elde edeceğiniz aşağıda açıklanmıştır. Bunun daha iyi görünüp görünmeyeceği tartışmalı, ben şahsen yukarıdakilere sadık kalacağım.
resim açıklamasını buraya girin


Vaov! Bu oldukça mükemmel, teşekkürler. Bu istediğim her şeye cevap veriyor, ancak ekstra kek puanları için, bağlantıyı daha etkileşimli hale getirmenin bir yolu var mı? Demek istediğim, URL'yi çıkarmanın kolay bir yolu. Tıklatarak arasında [foo]ve arasında geçiş yapmak mümkün müdür [foo](http://bar.com)? Ayrıntılardan çok rahatsız değilim, ancak istenirse URL'yi kolayca göstermenin bir yolunu istiyorum. Şu anda, köşeli parantezlerden birinin görünmesi için silmem gerekiyor. Bununla yaşayabilirim ama daha iyi bir şekilde ilgilenirdim.
terdon

@terdon Done! ..
Malabarba

Bunu Edit ile Emacs ile birleştireceğim ve sonra Tri-State Area'yı ele alacağım!
nispio

@Malabarba orada bir hata var gibi görünüyor. Ben olsun "Unknown rx form grup-n '" . Output of --debug-init` burada .? Herhangi bir fikir
Terdon

@terdon Grup-n'nin sadece 24.4'te tanımlanması olasıdır, kontrol etmeye çalışacağım. Her birini group-n X sadece ile değiştirmeyi deneyebilirsiniz group. O kudreti hala çalışır.
Malabarba

5

Başlangıç iyi bir yer olurdu markdown-mode.elindirilebilir hangi burada .

Bu mod org-modestil güzelleştirme sunmaz, ancak sözdizimi vurgulama ve çok sayıda customizeseçenek sunar.

Bu stil güzelleşmesini elde etmek için, birisinin markdown moduna bir uzantı yazması gerekir. Ya da yazı tipi yüzleri uygulamak.

  • Org-mode.el yüzlerine çoğu tanımlanmıştır org-faces.el .

  • Ayrıca kuruluş modunun metni görsel olarak karakterlerle nasıl değiştirdiğine de bakmak istersiniz. Bu kod, kuruluş kuruluşlarındadır . El. Bu, lateksin \pm± ile değiştirildiği koddur .


Teşekkürler, cevabımda belirttiğim gibi şu anda markdown modunu kullanıyorum. Eksik olan özelliklerin nasıl uygulanacağını ve emac'ların oluşturulmuş olarak nasıl görüntüleneceğini bilmek istiyorum. Alternatif olarak, bu durumda bunları görüntülenmenin imkansız olduğunu bilmek istiyorum.
terdon

Bunu yapmak mümkündür, org-mode böyle güzel sözdizimi yapar. Kodu bulmam için birkaç dakika ver. Başka bir büyük mod için benzer kodlama yaptım. Markdown.el hakkında zaten bildiğinizin farkında değildim.
nixeagle

Cevabını, istediğini yapmaya başlamak için bir yol sağlamak üzere düzenledim. Eve geldiğimde, tam olarak ne istediğini yapan bazı kodları patlatabilirim. Olduğu gibi, org-modu *baştaki seviyeleri gizlemek için başlıkları değiştirir ve başlığın boyutunu belgede nerede bulunduğuna göre değiştirir. Ayrıca bağlantıları güzel bir şekilde biçimlendirebilir.
nixeagle
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.