如何在emacs中使用Markdown的SE风格?


17

我想在emacs中使用markdown的SE风格。默认的Markdown模式具有一些功能(反引号和缩进标记代码,#创建标头以及>更改字体),但我也想拥有:

  • * 制作包括缩进在内的列表项。
  • [foo](http://example.com)显示为foohttp://example.com在单击时打开浏览器。

理想情况下,我希望在我的emacs中将其显示为Markdown。例如,如果我要写:

## 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模式是否已经为您突出显示了代码块?您在那找什么
马拉巴巴

另外,您是否希望它像WYSIWYG Markdown编辑器一样可编辑?还是足以在单独的缓冲区中显示“已编译”输出?后者相当简单,前者是一个编码巨兽。
马拉巴巴

@Malabarba,是的,代码很好。我想要的是i)自动缩进的列表ii)网址处理。通过xdg-open单击,或者甚至只是简单地显示目标地址,而在未单击时仅显示链接文本:单击时变为“单击此处Click [here](http://example.com)。这是在我的文本文档中无缝包含URL的快速方法。
terdon

好的,那么这两个都可以通过font-lock-add-keyword来实现。如果没有人击败我,我明天会尝试写点东西。
马拉巴巴

Answers:


19

**编辑:**自撰写本文以来,似乎部分功能已直接在markdown模式下实现。查看此评论以及其中的链接。


组态

您可以采用两种方法。

  1. 您可以编写一个编译降价代码的命令(使用shell命令)并在缓冲区中显示html。
  2. 您可以进行一些自定义a-la org-mode来使缓冲区看起来像渲染的markdown。

我在这里解释如何实现数字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属性隐藏链接的一部分,所以我们需要告诉font-lock,无论何时删除链接的一部分,它都应该擦除该属性(这样我们仍然可以对其进行编辑)。

(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-l,就像在org-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")))))

结果

这是前两套配置后的内容:
在此处输入图片说明

这也是配置完脸后会得到的结果。这看起来是否更好是有争议的,我个人会坚持上面的一种。
在此处输入图片说明


哇!谢谢,那几乎是完美的。这可以回答我要求的所有内容,但是对于布朗尼点,是否可以使链接更具交互性?我的意思是,提取URL的一种简单方法。通过单击可以在[foo]和之间切换[foo](http://bar.com)吗?我不太在意细节,但希望有一种轻松显示URL的方法。目前,我必须删除其中一个括号以使其出现。我可以接受,但是我会对更好的方法感兴趣。
terdon 2014年

@terdon完成..!
Malabarba

我将把它与Edit with Emacs结合起来,然后我将接管Tri-State Area!
nispio 2014年

@Malabarba那里似乎有错误。我在这里得到"Unknown rx form group-n'“ . Output of --debug-init` 。有什么想法吗?
terdon

@terdon可能仅在24.4中定义了group-n,我将尝试检查。您可以尝试将每个替换为group-n X just group。那可能仍然有效。
马拉巴巴2014年

5

一个很好的起点是markdown-mode.el可以从这里下载。

此模式不提供org-mode样式美化功能,但提供语法高亮显示和一系列customize选项。

为了美化这种样式,有人需要为markdown-mode.el编写一个扩展来实现字体。

  • org-mode.el的大多数面孔都在org-faces.el中定义。

  • 另外,您将要看一下组织模式在视觉上如何用字符替换文本。该代码在org-entities.el中。这是\pm用± 代替乳胶的代码。


谢谢,正如我在回答中提到的,我目前正在使用降价模式。我想知道如何实现缺少的功能,以及如何让emacs将它们显示为已渲染。另外,我想知道如果是这种情况,就不可能显示它们。
terdon

这样做是可能的,org-mode会这样进行语法美化。给我一些时间来找到代码。我对另一种主要模式做了类似的编码。我没有意识到您已经了解markdown.el。
nixeagle14年

我已经编辑了答案,以提供一种开始做您想做的事情的方法。当我回到家时,我也许可以敲出一些完全符合您想要的代码。实际上,组织模式会修改标题以隐藏*表示级别,并根据标题在文档中的位置来更改标题的大小。它也能够格式化链接。
nixeagle14年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.