Comment puis-je utiliser la saveur SE de Markdown dans emacs?

17

Je voudrais utiliser la saveur SE de démarque dans mes emacs. Le mode Markdown par défaut a quelques fonctionnalités (backticks et indentation mark code, #fait un en-tête et >change également la police) mais j'aimerais aussi avoir:

  • * pour créer un élément de liste, y compris le retrait.
  • [foo](http://example.com)pour apparaître comme foo et ouvrir un navigateur http://example.comlorsque vous cliquez dessus.

Idéalement, je voudrais que cela soit affiché dans mes emacs comme Markdown rendu. Par exemple, si je devais écrire:

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

J'aimerais qu'il soit rendu comme ceci dans emacs lui-même:


Entête

  • objet 1
  • point 2

    while true; do echo foo; done
    

Fin de liste et plus de code

while true; do echo bar; done

Voir ici pour plus de détails


Peut-on y parvenir et, si oui, comment?

terdon
la source
À propos du bloc de code en cours de rendu: le mode Markdown ne met-il pas déjà en évidence les blocs de code pour vous? Que cherchais-tu là-bas?
Malabarba
Aussi, voulez-vous que ce soit modifiable, comme un éditeur Markdown WYSIWYG? Ou est-ce suffisant pour afficher la sortie "compilée" dans un tampon séparé? Ce dernier est assez simple, le premier est un géant du codage.
Malabarba
@Malabarba, oui, le code est bien. Ce que je voudrais, c'est i) les listes en retrait automatique ii) la gestion des URL. Soit à travers, xdg-opensoit simplement en affichant simplement l'adresse cible lorsque vous cliquez dessus, mais le texte du lien dans le cas contraire: "Cliquez ici " pour devenir Click [here](http://example.com)lorsque vous cliquez dessus. Juste un moyen rapide d'inclure des URL en toute transparence dans mes documents texte.
terdon
OK, alors les deux peuvent être réalisés avec font-lock-add-keyword. J'essaierai d'écrire quelque chose demain, si personne ne me bat dessus.
Malabarba

Réponses:

19

** EDIT: ** Depuis cette écriture, il semble qu'une partie des fonctionnalités a été directement implémentée en mode markdown. Consultez ce commentaire et les liens qu'il contient.


Configuration

Vous pouvez adopter deux approches.

  1. Vous pouvez écrire une commande qui compile le code de démarque (à l'aide d'une commande shell) et affiche le code html dans un tampon.
  2. Vous pouvez effectuer certaines personnalisations en mode organisationnel pour que le tampon ressemble à une démarque rendue.

J'explique ici comment implémenter le numéro 2. Copiez simplement tout le code ci-dessous dans votre fichier init.

Ajouter les règles de verrouillage des polices

Cette variable contrôle l'apparence des listes. Il ajoute de l'espace pour mettre la liste en retrait et utilise un joli point (si votre police peut l'afficher).

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

Il s'agit de la commande qui ajoute réellement les règles. Il y en a un pour les listes et un pour les liens.

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

Rendre le lien modifiable

Parce que nous utilisons la displaypropriété pour masquer une partie du lien, nous devons dire à font-lock qu'il doit effacer cette propriété chaque fois que vous supprimez une partie du lien (de cette façon, nous pouvons toujours le modifier).

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

Nous pouvons également définir une commande pour la modifier facilement, liée à C-c C-l, comme en mode 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)))

(Facultatif) Configurer certains visages

Cela devrait suffire pour les points que vous avez demandés. Si vous voulez que votre tampon ressemble encore plus au démarquage SE, appelez

M-x customize-group RET markdown-faces

et changez ce que vous jugez bon. J'ai fait quelques configurations moi-même, et voici ce que j'ai obtenu.

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

Résultats

Voici ce que vous obtiendrez après les 2 premiers ensembles de configurations:
entrez la description de l'image ici

Voici également ce que vous obtiendrez après avoir configuré les visages. On peut se demander si cela a l'air mieux, je m'en tiendrai personnellement à celui ci-dessus.
entrez la description de l'image ici

Malabarba
la source
Hou la la! C'est presque parfait, merci. Cela répond à tout ce que j'ai demandé, mais pour des points brownie supplémentaires, existe-t-il un moyen de rendre le lien plus interactif? Je veux dire, un moyen facile d'extraire l'URL. Serait-il possible de basculer entre [foo]et [foo](http://bar.com)en cliquant? Je ne suis pas trop gêné par les détails, mais je voudrais un moyen d'afficher facilement l'URL si vous le souhaitez. Pour le moment, je dois supprimer l'un des crochets pour qu'il apparaisse. Je peux vivre avec ça mais je serais intéressé par une meilleure façon.
terdon
@terdon Done! ..
Malabarba
Je vais combiner cela avec Edit avec Emacs , puis je reprendrai la zone des trois États!
nispio
@Malabarba il semble y avoir une erreur. Je reçois "Unknown rx form group-n '" . Output of --debug-init` ici . Des idées?
terdon
@terdon Il est possible que le groupe-n ne soit défini qu'en 24.4, je vais essayer de vérifier. Vous pouvez essayer de remplacer chacun d'eux group-n X par juste group. Cela pourrait encore fonctionner.
Malabarba
5

Un bon point de départ serait de markdown-mode.elle télécharger ici .

Ce mode n'offre pas d' org-modeembellissement de style, mais il offre une mise en évidence de la syntaxe et une multitude d' customizeoptions.

Afin d'obtenir cette embellissement de style, quelqu'un devrait écrire une extension pour markdown-mode.el implémentant font-faces.

  • La plupart des visages d'org-mode.el sont définis dans org-faces.el .

  • De plus, vous voudrez voir comment le mode organisationnel remplace visuellement le texte par des caractères. Ce code se trouve dans org-entity.el . C'est le code qui remplace le latex \pmpar ±.

nixeagle
la source
Merci, j'utilise le mode markdown pour le moment, comme je le mentionne dans ma réponse. Je voudrais savoir comment implémenter les fonctionnalités qui manquent et comment avoir emacs les afficher comme rendu. Sinon, j'aimerais savoir qu'il est impossible de les afficher rendus si c'est le cas.
terdon
Il est possible de le faire, org-mode fait de l'embellissement de la syntaxe comme ça. Donnez-moi quelques instants pour trouver le code. J'ai fait un codage similaire pour un autre mode majeur. Je ne savais pas que vous connaissiez déjà markdown.el.
nixeagle
J'ai modifié la réponse pour fournir un moyen de commencer à faire ce que vous voulez. Quand je rentrerai à la maison, je pourrai peut-être créer du code qui fait exactement ce que vous voulez. En l'état, le mode organisation modifie les titres pour masquer les *niveaux de dénotation et change la taille du titre en fonction de son emplacement dans le document. Il est également capable de jolis formats de liens.
nixeagle