Как я могу использовать 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

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


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


О отображаемом блоке кода: разве режим 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")))))

Результаты

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

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


Вот это да! Это почти идеально, спасибо. Это отвечает на все вопросы, которые я просил, но есть ли возможность сделать ссылку более интерактивной? Я имею в виду, простой способ извлечь 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на ±.


Спасибо, сейчас я использую режим уценки, как я упоминаю в своем ответе. Я хотел бы знать, как реализовать отсутствующие функции, а также как сделать так, чтобы emacs отображал их как предоставленные. В качестве альтернативы, я хотел бы знать, что невозможно отобразить их визуализацию, если это так.
— Тердон

Это можно сделать, org-mode делает так синтаксическое украшение. Дайте мне несколько минут, чтобы найти код. Я сделал подобное кодирование для другого основного режима. Я не понял, что вы уже знали о markdown.el.
— nixeagle

Я отредактировал ответ, чтобы обеспечить способ начать делать то, что вы хотите. Когда я вернусь домой, я смогу набрать код, который будет делать то, что вы хотите. Таким образом, org-mode изменяет заголовки, чтобы скрыть *обозначающие уровни, и изменяет размер заголовка в зависимости от того, где он находится в документе. Он также умеет красиво форматировать ссылки.
— nixeagle
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.