Wie kann ich die SE-Variante von Markdown in Emacs verwenden?

17

Ich möchte den SE-Geschmack von Markdown in meinem Emacs verwenden. Der Standard-Markdown-Modus bietet einige Funktionen (Backticks und Code für Einrückungsmarkierungen, erstellt #eine Kopfzeile und >ändert auch die Schriftart), aber ich hätte auch gerne:

  • * um ein Listenelement einschließlich Einrückung zu erstellen.
  • [foo](http://example.com)um als foo zu erscheinen und einen browser zu öffnen, http://example.comwenn geklickt wird.

Im Idealfall möchte ich, dass dies in meinem Emacs als gerenderter Markdown angezeigt wird. Zum Beispiel, wenn ich schreiben würde:

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

Ich möchte, dass es in Emacs selbst so gerendert wird:


Header

  • Gegenstand 1
  • Punkt 2

    while true; do echo foo; done
    

Ende der Liste und mehr Code

while true; do echo bar; done

Einzelheiten finden Sie hier


Kann dies erreicht werden und wenn ja, wie?

terdon
quelle
Informationen zum gerenderten Codeblock: Markieren Sie im Markdown-Modus nicht bereits Codeblöcke für Sie? Was suchten Sie dort?
Malabarba
Möchten Sie auch, dass dies wie ein WYSIWYG-Markdown-Editor bearbeitet werden kann? Oder reicht es aus, die "kompilierte" Ausgabe in einem separaten Puffer anzuzeigen? Das letztere ist ziemlich einfach, das erstere ist ein Codier-Gigant.
Malabarba
@ Malabarba, ja, der Code ist in Ordnung. Was ich möchte, ist i) automatisch eingerückte Listen ii) URL-Bearbeitung. Entweder durch xdg-openoder auch nur einfach die Anzeige der Zieladresse , wenn darauf geklickt , aber der Link - Text , wenn sie nicht: „Klicken Sie hier “ zu werden , Click [here](http://example.com)wenn darauf geklickt wird . Nur eine schnelle Möglichkeit, URLs nahtlos in meine Textdokumente aufzunehmen.
Terdon
OK, dann können beide mit font-lock-add-keyword erreicht werden. Ich werde versuchen, morgen etwas aufzuschreiben, wenn mich niemand schlägt.
Malabarba

Antworten:

19

** EDIT: ** Seit diesem Schreiben scheint ein Teil der Funktionen direkt im Markdown-Modus implementiert worden zu sein. Schauen Sie sich diesen Kommentar und die darin enthaltenen Links an.


Aufbau

Sie können zwei Ansätze wählen.

  1. Sie können einen Befehl schreiben, der den Markdown-Code kompiliert (mithilfe eines Shell-Befehls) und den HTML-Code in einem Puffer anzeigt.
  2. Sie können einige Anpassungen im Organisationsmodus vornehmen, damit der Puffer wie ein gerenderter Markdown aussieht .

Ich erkläre hier, wie Nummer 2 implementiert wird. Kopieren Sie einfach den gesamten folgenden Code in Ihre Init-Datei.

Fügen Sie die Regeln für die Schriftsperre hinzu

Diese Variable steuert, wie Listen aussehen sollen. Es fügt etwas Platz zum Einrücken der Liste hinzu und verwendet einen hübschen Aufzählungspunkt (falls Ihre Schriftart dies anzeigen kann).

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

Dies ist der Befehl, der die Regeln tatsächlich hinzufügt. Es gibt eine für Listen und eine für Links.

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

Machen Sie den Link bearbeitbar

Da wir die displayEigenschaft verwenden, um einen Teil des Links auszublenden, müssen wir font-lock mitteilen, dass diese Eigenschaft gelöscht werden soll, wenn Sie einen Teil des Links löschen (auf diese Weise können wir ihn weiterhin bearbeiten).

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

Wir können auch einen Befehl definieren, um ihn einfach zu bearbeiten, gebunden an C-c C-l, wie im org-Modus.

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

(Optional) Konfigurieren Sie einige Gesichter

Das sollte für die von Ihnen angeforderten Punkte ausreichen. Wenn Sie möchten, dass Ihr Puffer noch mehr wie ein SE-Abschlag aussieht , rufen Sie an

M-x customize-group RET markdown-faces

und ändern Sie, was Sie für richtig halten. Ich habe mich selbst konfiguriert und hier ist, was ich habe.

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

Ergebnisse

Nach den ersten beiden Konfigurationen erhalten Sie Folgendes:
Bildbeschreibung hier eingeben

Folgendes erhalten Sie auch nach dem Konfigurieren von Gesichtern. Es ist fraglich, ob dies besser aussieht, ich bleibe persönlich bei der obigen.
Bildbeschreibung hier eingeben

Malabarba
quelle
Beeindruckend! Das ist fast perfekt, danke. Dies beantwortet alles, wonach ich gefragt habe, aber gibt es eine Möglichkeit, den Link interaktiver zu gestalten, um zusätzliche Brownie-Punkte zu erhalten? Ich meine, eine einfache Möglichkeit, die URL zu extrahieren. Wäre es möglich, zwischen [foo]und [foo](http://bar.com)durch Klicken umzuschalten? Ich bin nicht sonderlich mit den Details beschäftigt, möchte aber auf Wunsch die URL auf einfache Weise anzeigen. Im Moment muss ich eine der Klammern löschen, damit sie angezeigt wird. Ich kann damit leben, aber ich würde mich für eine bessere Art interessieren.
Terdon
@terdon Fertig! ..
Malabarba
Ich werde das mit Edit mit Emacs kombinieren und dann die Tri-State Area übernehmen!
Nispio
@Malabarba da scheint ein Fehler zu sein. Ich bekomme "Unknown rx form Gruppe-n " . Output of --debug-init" hier . Irgendwelche Ideen?
Terdon
@terdon Es ist möglich, Gruppe-n ist nur in 24.4 definiert, ich werde versuchen, zu überprüfen. Sie können versuchen, jedes group-n X durch nur zu ersetzen group. Das könnte noch funktionieren.
Malabarba
5

Ein guter Startpunkt wäre der, markdown-mode.elder hier heruntergeladen werden kann .

Dieser Modus bietet keine org-modeStilverschönerung, aber Syntaxhervorhebung und eine Vielzahl von customizeOptionen.

Um diesen Stil zu verschönern, müsste jemand eine Erweiterung für markdown-mode.el schreiben, die Schriftarten implementiert.

  • Die meisten Gesichter von org-mode.el sind in org-faces.el definiert .

  • Außerdem möchten Sie einen Blick darauf werfen, wie der Organisationsmodus Text durch Zeichen ersetzt. Dieser Code befindet sich in org-entity.el . Dies ist der Code, der den Latex \pmdurch ± ersetzt.

Nixeagle
quelle
Danke, ich benutze im Moment den Abschriftenmodus, wie ich in meiner Antwort erwähne. Ich würde gerne wissen, wie man die fehlenden Features implementiert und wie man Emacs sie als gerendert anzeigen lässt. Alternativ möchte ich wissen, dass es unmöglich ist, sie gerendert anzuzeigen, wenn dies der Fall ist.
Terdon
Dies ist möglich, im org-mode wird die Syntax so verschönert. Geben Sie mir einen Moment Zeit, um den Code zu finden. Ich habe eine ähnliche Codierung für einen anderen Hauptmodus durchgeführt. Mir war nicht klar, dass Sie bereits über markdown.el Bescheid wussten.
Nixeagle
Ich habe die Antwort bearbeitet, um eine Möglichkeit zu bieten, damit zu beginnen, was Sie wollen. Wenn ich nach Hause komme, kann ich möglicherweise einen Code aufrufen, der genau das tut, was Sie wollen. Im org-Modus werden Titel so *geändert , dass die Kennzeichnungsebenen ausgeblendet werden und die Größe des Titels entsprechend der Position im Dokument geändert wird. Es ist auch in der Lage, Links hübsch zu formatieren.
Nixeagle