Come posso usare il sapore SE di Markdown in emacs?


17

Vorrei usare il sapore SE di markdown nei miei emacs. La modalità Markdown predefinita ha alcune funzionalità (backtick e codice del segno di rientro, #crea un'intestazione e >cambia anche il carattere) ma vorrei anche avere:

  • * per creare una voce di elenco, incluso il rientro.
  • [foo](http://example.com)per apparire come pippo e aprire un browser http://example.comquando si fa clic.

Idealmente, vorrei che questo fosse mostrato nei miei emacs come Markdown renderizzato. Ad esempio, se dovessi scrivere:

## 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

Vorrei che fosse reso così in emacs stesso:


Intestazione

  • articolo 1
  • articolo 2

    while true; do echo foo; done
    

Fine dell'elenco e altro codice

while true; do echo bar; done

Vedi qui per i dettagli


Ciò può essere ottenuto e, in tal caso, come?


Informazioni sul blocco di codice in fase di rendering: la modalità Markdown non evidenzia già i blocchi di codice per te? Cosa stavi cercando lì?
Malabarba,

Inoltre, vuoi che sia modificabile, come un editor Markdown WYSIWYG? O è sufficiente visualizzare l'output "compilato" in un buffer separato? Il secondo è piuttosto semplice, il primo è un colosso della programmazione.
Malabarba,

@Malabarba, sì, il codice va bene. Quello che vorrei è i) elenchi con rientro automatico ii) gestione degli URL. O xdg-opensemplicemente o semplicemente visualizzando l'indirizzo di destinazione quando si fa clic su, ma il testo del collegamento quando no: "Fare clic qui " per diventare Click [here](http://example.com)quando si fa clic. Solo un modo rapido per includere perfettamente gli URL nei miei documenti di testo.
terdon,

OK, entrambi questi possono essere raggiunti con font-lock-add-keyword. Proverò a scrivere qualcosa domani, se nessuno mi picchia.
Malabarba,

Risposte:


19

** EDIT: ** Da questa scrittura, sembra che parte delle funzionalità siano state implementate direttamente in modalità markdown. Dai un'occhiata a questo commento e ai relativi collegamenti.


Configurazione

Ci sono due approcci che puoi adottare.

  1. È possibile scrivere un comando che compila il codice markdown (usando un comando shell) e visualizzi l'html in un buffer.
  2. È possibile effettuare alcune personalizzazioni a-l'org-mode per fare il buffer di aspetto simile Markdown resa.

Spiego qui come implementare il numero 2. Copia semplicemente tutto il codice qui sotto nel tuo file init.

Aggiungi le regole di blocco dei caratteri

Questa variabile controlla l'aspetto delle liste. Aggiunge un po 'di spazio per rientrare nell'elenco e utilizza un bel punto elenco (se il font può visualizzarlo).

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

Questo è il comando che aggiunge effettivamente le regole. Ce n'è uno per gli elenchi e uno per i collegamenti.

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

Rendi il collegamento modificabile

Poiché stiamo usando la displayproprietà per nascondere parte del collegamento, dobbiamo dire a font-lock che dovrebbe cancellare quella proprietà ogni volta che elimini parte del collegamento (in questo modo possiamo ancora modificarlo).

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

Possiamo anche definire un comando per modificarlo facilmente, associato C-c C-l, come in modalità org.

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

(Facoltativo) Configura alcune facce

Questo dovrebbe essere sufficiente per i punti richiesti. Se vuoi che il tuo buffer assomigli ancora di più al markdown SE, chiama

M-x customize-group RET markdown-faces

e cambia ciò che ritieni opportuno. Ho fatto un po 'di configurazione, ed ecco cosa ho ottenuto.

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

risultati

Ecco cosa otterrai dopo le prime 2 serie di configurazioni:
inserisci qui la descrizione dell'immagine

Ecco cosa otterrai anche dopo aver configurato i volti. È discutibile se questo sembra migliore, mi atterrò personalmente con quello sopra.
inserisci qui la descrizione dell'immagine


Wow! È quasi perfetto, grazie. Questo risponde a tutto ciò che ho chiesto, ma per ulteriori punti brownie, c'è un modo per rendere il collegamento più interattivo? Voglio dire, un modo semplice per estrarre l'URL. Sarebbe possibile alternare tra [foo]e [foo](http://bar.com)facendo clic? Non mi preoccupo troppo dei dettagli, ma vorrei un modo per visualizzare facilmente l'URL, se lo si desidera. Al momento, devo eliminare una delle parentesi affinché appaia. Posso conviverci ma sarei interessato in un modo migliore.
terdon,

@terdon Done! ..
Malabarba,

Ho intenzione di combinare questo con Modifica con Emacs , e poi prenderò il controllo dell'area Tri-State!
nispio,

@Malabarba sembra esserci un errore lì. Ottengo "Unknown rx form group-n '" . Output of --debug-init` qui . Qualche idea?
Terdon,

@terdon È possibile che il gruppo-n sia definito solo in 24.4, proverò a controllare. Puoi provare a sostituire ciascuno dei group-n X con just group. Che potrebbe lavori ancora.
Malabarba,

5

Un buon punto di partenza sarebbe markdown-mode.elche può essere scaricato da qui .

Questa modalità non offre org-modeabbellimenti di stile, ma offre l'evidenziazione della sintassi e una serie di customizeopzioni.

Per ottenere questo abbellimento di stile, qualcuno dovrebbe scrivere un'estensione in markdown-mode.el implementando font-faces.

  • La maggior parte delle facce di org-mode.el sono definite in org-faces.el .

  • Inoltre, vorrai dare un'occhiata a come la modalità org sostituisce visivamente il testo con i caratteri. Quel codice è in org-entity.el . Questo è il codice che sostituisce il lattice \pmcon ±.


Grazie, sto usando la modalità markdown al momento, come menziono nella mia risposta. Vorrei sapere come implementare le funzionalità che mancano e anche come fare in modo che Emacs le visualizzi come renderizzate. In alternativa, mi piacerebbe sapere che è impossibile visualizzarli resi in questo caso.
terdon,

È possibile farlo, la modalità org fa abbellire la sintassi in questo modo. Dammi qualche momento per trovare il codice. Ho fatto una codifica simile per un'altra modalità principale. Non mi rendevo conto che già sapevi di markdown.el.
nixeagle,

Ho modificato la risposta per fornire un modo per iniziare a fare ciò che desideri. Quando torno a casa, potrei essere in grado di recuperare un po 'di codice che fa esattamente quello che vuoi. Così com'è, la modalità org modifica i titoli per nascondere i *livelli di denotazione e cambia le dimensioni del titolo in base a dove si trova nel documento. È anche in grado di formattare i collegamenti.
nixeagle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.