emacsでMarkdownのSEフレーバーを使用するにはどうすればよいですか?


17

私はemacsでマークダウンのSE風味を使用したいと思います。デフォルトのマークダウンモードには、いくつかの機能(バックティックとインデントマークコード、#ヘッダーの作成>、フォントの変更)がありますが、次の機能も必要です。

  • * インデントを含むリストアイテムを作成します。
  • [foo](http://example.com)fooとして表示されhttp://example.com、クリックするとブラウザが開きます。

理想的には、これをレンダリングされたマークダウンとしてemacsに表示したいと思います。たとえば、次のように書く場合:

## 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自体で次のようにレンダリングしたいと思います。


ヘッダ

  • アイテム1
  • アイテム2

    while true; do echo foo; done
    

リストの終わりとその他のコード

while true; do echo bar; done

詳細はこちらをご覧ください


これを達成できますか?


レンダリングされるコードブロックについて:Markdownモードではコードブロックが既に強調表示されていませんか?そこで何を探していましたか?
マラバルバ14年

また、これをWYSIWYG Markdownエディターのように編集可能にしたいですか?または、「コンパイル済み」出力を別のバッファーに表示するだけで十分ですか?後者はかなり単純で、前者はコーディングの巨人です。
マラバルバ14年

@Malabarba、はい、コードは問題ありません。私が望むのは、i)自動インデントリストii)URL処理です。いずれかを介してxdg-open「クリックしてください。ただ単にないときにクリックしたときに、ターゲットアドレスを表示しますが、リンクテキストも、またはここになるために」Click [here](http://example.com)クリックしたときに。テキストドキュメントにURLをシームレスに含めるための簡単な方法。
テルドン14年

OK、これらの両方はfont-lock-add-keywordで実現できます。明日、誰も私に勝てないなら、何かを書き上げようとします。
マラバルバ14年

回答:


19

**編集:**この執筆以来、機能の一部はマークダウンモードで直接実装されているようです。このコメントとその中のリンクをチェックしてください。


構成

あなたが取ることができる2つのアプローチがあります。

  1. (シェルコマンドを使用して)マークダウンコードをコンパイルし、バッファー内のhtmlを表示するコマンドを作成できます。
  2. いくつかのカスタマイズをa-la org-modeで行い、バッファーマークダウンのように見せることができます。

ここでは、2番の実装方法を説明します。以下のすべてのコードをinitファイルにコピーするだけです。

フォントロック規則を追加する

この変数は、リストの外観を制御します。リストをインデントするためのスペースを追加し、きれいな箇条書きを使用します(フォントで表示できる場合)。

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

これは、実際にルールを追加するコマンドです。リスト用とリンク用があります。

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

リンクを編集可能にする

displayプロパティを使用してリンクの一部を非表示にしているため、フォントのロックに、リンクの一部を削除するたびにそのプロパティを消去するように指示する必要があります(そのように編集できます)。

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

C-c C-lorg-modeのように、にバインドして簡単に編集するコマンドを定義することもできます。

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

(オプション)いくつかの面を構成する

それはあなたが要求したポイントに十分なはずです。あなたのバッファが見たい場合は、さらに SEの値下げのように、コール

M-x customize-group RET markdown-faces

そして、あなたが合うと思うものを変えてください。私は自分自身でいくつかの設定を行いました。

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

結果

以下は、最初の2セットの構成の後に得られるものです。
ここに画像の説明を入力してください

顔を設定した後にも何が得られます。これが良く見えるかどうかは議論の余地がありますが、私は個人的に上記のものに固執します。
ここに画像の説明を入力してください


うわー!ほぼ完璧です、ありがとう。これは私が求めたすべてに答えますが、余分なブラウニーポイントについては、リンクをよりインタラクティブにする方法はありますか?つまり、URLを抽出する簡単な方法です。切り替えることが可能であろう[foo]し、[foo](http://bar.com)クリックして?詳細についてはあまり気にしませんが、必要に応じてURLを簡単に表示する方法が欲しいです。現時点では、ブラケットの1つを削除して表示する必要があります。私はそれで生きることができますが、もっと良い方法に興味があります。
テルドン14年

@terdon完了!..
マラバルバ

これをEdit with Emacsと組み合わせて、Tri-State Areaを引き継ぎます!
nispio 14年

@Malabarbaにエラーがあるようです。私は取得"Unknown rx form グループ-n 'を」. Output of --debug-init`をここに任意のアイデア?
terdon

@terdon group-nは24.4でのみ定義されている可能性があるので、確認してみます。各group-n X を単にに置き換えてみてくださいgroup。それかもしれないが、まだ仕事。
マラバルバ14年

5

開始するのに適した場所はmarkdown-mode.elここからダウンロードできます

このモードはorg-modeスタイルの美化を提供しませんが、構文の強調表示と多数のcustomizeオプションを提供します。

このスタイルを美しくするためには、誰かがfont-facesを実装するmarkdown-mode.elの拡張を書く必要があります。

  • ORG-mode.elの顔のほとんどは、で定義されているORG-faces.el

  • さらに、org-modeがテキストを文字で視覚的に置き換える方法を調べてください。そのコードはorg-entities.elにあります。これは、ラテックス\pmを±に置き換えるコードです。


おかげで、私は私の答えで言及したように、現時点ではマークダウンモードを使用しています。不足している機能を実装する方法、およびemacsでレンダリングされたとおりに表示する方法を知りたいです。また、そうであれば、レンダリングされた画像を表示することは不可能であることを知りたいです。
テルドン14年

そうすることは可能ですが、org-modeはそのような構文の美化を行います。コードを見つけるまでしばらくお待ちください。別のメジャーモードでも同様のコーディングを行いました。あなたが既にmarkdown.elを知っていることを知りませんでした。
nixeagle 14年

答えを編集して、あなたがやりたいことを始める方法を提供しました。私が家に帰ると、私はあなたが望むものを正確に実行するコードを強打できるかもしれません。org-modeは、タイトルを変更して、*意味のあるレベルを非表示にし、ドキュメント内の位置に基づいてタイトルのサイズを変更します。リンクをきれいにフォーマットすることもできます。
nixeagle 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.