2010-08-04 2 views
43

Можно ли отобразить Markdown в буфере Emacs, используя собственные возможности форматирования текста буфера Emacs? Emacs в графических средах обладает богатыми возможностями текстового представления (стили шрифтов, цвета, ссылки и даже изображения), поэтому это должно быть вполне возможно. Существуют ли какие-либо существующие реализации?Render Markdown в буфере Emacs

Обратите внимание, что идея состоит в том, чтобы рендеринг Markdown был родным форматированным текстом Emacs, который можно перемещать и работать как любой другой текст в Emacs. Поэтому здесь не нужны решения, которые отображают изображение, встроенное в буфер Emacs.

Также обратите внимание, что это не о режиме для редактирования Markdown, но для представления визуализированного Markdown в буфере Emacs. Он должен предпочтительно быть чистым решением Emacs Lisp для переносимости.

+0

Любые особые требования? Так же, как «разметка» не означает HTML, «уценка» довольно неопределенная. – phils

+1

Markdown как в любом диалекте Markdown, если это то, что вы имели в виду! –

ответ

6

Я думаю, вы можете использовать исходный код latex-preview для вдохновения или pretty-lambda (гораздо более простая часть программного обеспечения).

В качестве альтернативы вы можете преобразовать уценку в html в фоновом режиме и просмотреть html.

Все возможно в Emacs, но не все легко достигается :-)

+1

Спасибо, что упомянул латекс-превью. Однако мне не хотелось бы отображать Markdown как изображение, встроенное в буфер Emacs, но как родной текст в формате Emacs, который можно перемещать и использовать как любой другой текст. Может быть, кое-что можно было бы узнать из симпатичной лямбды. –

1

Если речь идет только о рендеринга, идти с предложением Божидар и сделать Markdown для преобразования HTML, а затем отображать HTML в W3 буфер. markdown-mode имеет код для вызова внешней команды Markdown с несколькими положительными героями.

Но если вы действительно хотите сделать все, что в Emacs Lisp, вам придется сначала написать анализатор Markdown.

+1

Спасибо, но я действительно хочу иметь все это в Emacs Lisp для переносимости. Поэтому я надеюсь найти существующий парсер Emacs Lisp Markdown. –

3

Поскольку я не знаю ни одного анализатора Markdown, основанного на emacs, я должен сказать, что вам нужно закодировать его с нуля. Может быть this SO вопрос может бросить некоторые указатели на вас.

Если вы решите пройти через дорогу только для Emacs, то Semantic - отличный API для этой работы (он предлагает вам лексер, синтаксический анализатор и парсер, он существует уже более десятилетия, и он имеет документацию!). После использования парсера языка вам нужно будет сделать некоторые функции рендеринга для каждого типа токена. И таким образом вы можете настроить все.

Хотя, конечно, это была бы просветительская поездка, я бы предпочел использовать существующий Markdown-> html конвертер в отдельном фоновом процессе, а затем использовать w3 (m) для предварительного просмотра emacs (как предложил Божидар). Он выполняет свою работу, и это гораздо проще сделать. Никаких серьезных проблем с производительностью, ни один из них - вы должны запускать этот инструмент довольно редко, поэтому вы можете сэкономить несколько миллисекунд).

Смешанное решение должно заключаться в том, чтобы заставить анализатор Markdown генерировать HTML напрямую и просматривать его в буфере w3 (m) (он отнимает вес рендеринга с ваших плеч, вам нужно всего лишь транслитерировать уценку в html и что кажется довольно прямым с семантикой).

+0

Благодарим вас за ссылку на вопрос о разборке Markdown и упоминание о семантике. –

0

Я тоже, я искал что-то вроде этого для очень долгое время. Однако лучшее, что я мог найти, это не решение Emacs, это независимый большой программный продукт под названием ReText.

+0

Под Mac у вас есть аналогичная альтернатива: [MOU] (http://mouapp.com/) –

5

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

+0

Звучит как прагматичный подход с небольшим усилием (просто обновляя правила блокировки шрифтов), и это не зависит от какого-либо внешнего инструмента или процесс, который является хорошим. –

18

Personnaly, я использую следующий рабочий процесс:

  • запустить на C-c C-c m запустить Markdown на текущий буфер и предварительно просмотреть результат в другом буфере.
  • перейти к html-mode на этом другом буфере (M-x html-mode)
  • скрыть HTML-теги, чтобы отобразить что-то близкое к выходу (M-x sgml-tags-invisible)

Тогда каждый раз, когда вы хотите обновить рендеринга, просто запустите снова C-c C-c m в буфере уценки.

Тем не менее, я до сих пор исповедую редактирование/предварительный просмотр Markdown, ничто не сравнится со мной Textmate и панель предварительного просмотра уценок. Собственно, в личной перспективе единственный случай, когда я предпочитаю запускать Textmate, а не Emacs, - это когда я хочу редактировать файлы разметки. Однако путь к тому же качеству предварительного просмотра на emacs не так сложно и, вероятно, я должен его исследовать. Как я понимаю, это просто:

  • получить внутренний CSS, используемый Textmate для визуализации в окне предварительного просмотра
  • использование w3 или w3m для предварительного вывода уценки, используя этот CSS
+0

Спасибо, любите, как вы объединили все эти функции :) – dolzenko

+3

Отличная настройка, но по какой-то причине я не могу обновиться. Когда я запускаю 'C-c C-c m' в обработанном буфере, я получаю' C-c C-c m undefined', и когда я запускаю его в исходном буфере, я получаю 'Text is read-only'. Как я могу обойти это? –

+0

Вы находитесь в режиме «markdown-mode»? Возможно, вы можете убедиться, что ваш 'markdown-mode' установлен и обновлен.Вы также можете запустить 'C-h k C-c C-c m', чтобы проверить, привязан ли' C-c C-c m' к функции 'markdown-other-window'. Вы также можете просто запустить функцию «markdown-other-window' непосредственно с помощью« M-x markdown-other-window ». – modulitos

6

У меня есть это файл .emacs:

(custom-set-faces 
;; custom-set-faces was added by Custom. 
;; If you edit it by hand, you could mess it up, so be careful. 
;; Your init file should contain only one such instance. 
;; If there is more than one, they won't work right. 
'(markdown-header-delimiter-face ((t (:inherit font-lock-function-name-face :underline t :weight bold))) t) 
'(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.5))) t) 
'(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.3))) t) 
'(markdown-header-face-3 ((t (:inherit markdown-header-face :underline t :height 1.2))) t) 
'(markdown-header-face-4 ((t (:inherit markdown-header-face :underline t :height 1.1))) t) 
'(markdown-header-face-5 ((t (:inherit markdown-header-face :underline t))) t) 
'(markdown-header-face-6 ((t (:inherit markdown-header-face :underline t))) t)) 
(put 'set-goal-column 'disabled nil) 

который расширяет все заголовки. Сам режим Markdown выделяет выделение выделенного текста и полужирного текста полужирным шрифтом, так что это приведет вас туда. Однако это не приведет к тому, что контрольные символы станут невидимыми.

Если вы хотите, что, вероятно, вы должны смотреть в pretty-lambda примеры (как Bozhidar Batsov suggested)

4

Помимо pretty-lambda (который уже предложил несколько раз), вы можете посмотреть в org-mode и его правила подсветка кода. В частности, переменная org-hide-emphasis-markers делает больше или меньше того, что вы хотите (см., Например, как org-do-emphasis-faces скрыть символы разметки).