Как я могу использовать SE-аромат Markdown в emacs?

17

Я хотел бы использовать SE-аромат уценки в моем emacs. Режим уценки по умолчанию имеет некоторые функции (обратные метки и код отступа, #создает заголовок, а >также изменяет шрифт), но я также хотел бы иметь:

  • * сделать элемент списка, включая отступ.
  • [foo](http://example.com)отображаться как foo и открывать браузер http://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

Смотрите здесь для деталей


Можно ли этого достичь и, если да, то как?

terdon
источник
О отображаемом блоке кода: разве режим Markdown уже не выделяет блоки кода для вас? Что ты там искал?
Малабарба
Кроме того, вы хотите, чтобы это было редактируемым, как редактор WYSIWYG Markdown? Или достаточно отобразить «скомпилированный» вывод в отдельном буфере? Последний довольно прост, первый - бегемот кодирования.
Малабарба
@ Малабарба, да, код в порядке. То, что я хотел бы, это я) автоматически с отступом списки II) обработка URL. Через xdg-openили даже просто отображать целевой адрес при нажатии, но текст ссылки, когда нет: «Нажмите здесь », чтобы стать Click [here](http://example.com)при нажатии. Просто быстрый способ беспрепятственного включения URL в мои текстовые документы.
Тердон
Хорошо, тогда и того, и другого можно достичь с помощью font-lock-add-keyword. Я постараюсь написать что-нибудь завтра, если меня никто не побьет.
Малабарба

Ответы:

19

** РЕДАКТИРОВАТЬ: ** После написания этой статьи, кажется, что часть функций была непосредственно реализована в режиме уценки. Проверьте этот комментарий и ссылки в нем.


конфигурация

Есть два подхода, которые вы можете использовать.

  1. Вы можете написать команду, которая компилирует код уценки (используя команду оболочки) и отображает HTML в буфере.
  2. Вы можете сделать некоторые настройки в стиле org-la, чтобы буфер выглядел как визуализированная уценка.

Я объясняю здесь, как реализовать номер 2. Просто скопируйте весь код ниже в ваш файл инициализации.

Добавьте правила блокировки шрифтов

Эта переменная контролирует, как вы хотите, чтобы списки выглядели. Он добавляет пространство для отступа в списке и использует довольно точный пункт (если ваш шрифт может отображать его).

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

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

Результаты

Вот что вы получите после первых двух наборов конфигураций:
введите описание изображения здесь

Вот что вы получите после настройки лиц. Это спорно ли это выглядит лучше, я буду лично придерживаться одного выше.
введите описание изображения здесь

Malabarba
источник
Вот это да! Это почти идеально, спасибо. Это отвечает на все вопросы, которые я просил, но есть ли возможность сделать ссылку более интерактивной? Я имею в виду, простой способ извлечь URL. Можно ли переключаться между [foo]и [foo](http://bar.com)нажатием? Я не слишком обеспокоен деталями, но хотел бы способ легко отобразить URL при желании. На данный момент я должен удалить один из скобок, чтобы он появился. Я могу жить с этим, но я был бы заинтересован в лучшем способе.
тердон
@terdon Готово! ..
Малабарба
Я собираюсь объединить это с Edit с Emacs , а затем я возьму на себя область Tri-State!
Ниспио
@ Malabarba там, похоже, ошибка. Я получаю "Unknown rx form group-n '" . Output of --debug-init` здесь . Есть идеи?
Terdon
@terdon Возможно, группа-n определена только в 24.4, я попробую проверить. Вы можете попробовать заменить каждый из них group-n X просто group. Это может все еще работать.
Малабарба
5

Хорошее место для начала было бы, markdown-mode.elкоторое можно скачать отсюда .

Этот режим не предлагает org-modeулучшение стиля, но он предлагает подсветку синтаксиса и набор customizeопций.

Чтобы получить это украшение стиля, кто-то должен написать расширение для markdown-mode.el, реализующего font-face.

  • Большинство лиц org-mode.el определены в org-faces.el .

  • Кроме того, вы захотите взглянуть на то, как режим org визуально заменяет текст символами. Этот код находится в org-entity.el . Это код, который заменяет латекс \pmна ±.

nixeagle
источник
Спасибо, сейчас я использую режим уценки, как я упоминаю в своем ответе. Я хотел бы знать, как реализовать отсутствующие функции, а также как сделать так, чтобы emacs отображал их как предоставленные. В качестве альтернативы, я хотел бы знать, что невозможно отобразить их визуализацию, если это так.
Тердон
Это можно сделать, org-mode делает так синтаксическое украшение. Дайте мне несколько минут, чтобы найти код. Я сделал подобное кодирование для другого основного режима. Я не понял, что вы уже знали о markdown.el.
nixeagle
Я отредактировал ответ, чтобы обеспечить способ начать делать то, что вы хотите. Когда я вернусь домой, я смогу набрать код, который будет делать то, что вы хотите. Таким образом, org-mode изменяет заголовки, чтобы скрыть *обозначающие уровни, и изменяет размер заголовка в зависимости от того, где он находится в документе. Он также умеет красиво форматировать ссылки.
nixeagle