Як я можу використовувати SE аромат Markdown в emacs?


17

Я хотів би використовувати аромат SE відмітки у своїх електронних програмах. У режимі відмітки за замовчуванням є деякі функції (зворотні позначки та відступ коду позначки, #заголовок, а >також зміна шрифту), але я також хотів би мати:

  • * зробити елемент списку, включаючи відступи.
  • [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

Дивіться тут для подробиць


Чи можна цього досягти і, якщо так, то як?


Щодо блоку коду, що надається: чи не виділяється для вас уже код коду? Що ви там шукали?
Малабарба

Крім того, ви хочете, щоб це редагувалося, як редактор WYSIWYG Markdown? Або достатньо для відображення "складеного" виводу в окремому буфері? Останній досить простий, перший - кодуючий бегемот.
Малабарба

@Malabarba, так, код добре. Мені б хотілося, що я: автоматичні відступи списків; ii) обробка URL-адреси. Через xdg-openабо навіть просто відображення цільової адреси при натисканні, але текст посилання, коли ні: "Клацніть тут ", щоб стати Click [here](http://example.com)при натисканні. Просто швидкий спосіб безперешкодного включення URL-адрес у мої текстові документи.
тердон

Гаразд, тоді і те і інше можна досягти за допомогою ключового слова font-lock-add-add. Я спробую щось написати завтра, якщо мене ніхто не б’є.
Малабарба

Відповіді:


19

** EDIT: ** Починаючи з цього написання, здається, що частина функцій була безпосередньо реалізована в режимі розмітки. Перегляньте цей коментар та посилання на нього.


Конфігурація

Можна скористатися двома підходами.

  1. Ви можете написати команду, яка компілює код розмітки (за допомогою команди оболонки) і відображає html у буфері.
  2. Ви можете зробити кілька налаштувань , а-ля орг-режим , щоб зробити буферний зовнішній вигляд , як надана уцінка.

Я пояснюю тут, як реалізувати номер 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-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 Готово! ..
Малабарба

Я збираюся поєднати це з Правою з Emacs , і тоді я візьму на себе Тридержавний район!
nispio

@Malabarba там, здається, є помилка. Я "Unknown rx form група-н » . Output of --debug-init` тут Будь-які ідеї.?
terdon

@terdon Можливо, група-n визначена лише в 24.4, я спробую перевірити. Ви можете спробувати замінити кожне на group-n X справедливе group. Це все ще може працювати.
Малабарба

5

Гарним місцем для початку було б те, markdown-mode.elщо можна завантажити тут .

Цей режим не пропонує org-modeприкраси стилів, але він пропонує підсвічування синтаксису та масу customizeваріантів.

Для отримання цього стилю прикраси комусь потрібно буде написати розширення до markdown-mode.el, що реалізує шрифтові обличчя.

  • Більшість облич org-mode.el визначені в org-face.el .

  • Крім того, ви захочете поглянути на те, як org-режим візуально замінює текст символами. Цей код знаходиться в org-subjects.el . Це код, який замінює латекс \pmна ±.


Дякую, я зараз використовую режим розмітки, як я згадую у своїй відповіді. Мені хотілося б знати, як реалізувати відсутні функції, а також як Emacs відображати їх як візуалізовані. Крім того, я хотів би знати, що неможливо відобразити їх, відображені, якщо це так.
terdon

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

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