Введение
Мы уже много говорили о мощи Emacs. Давайте решим какую-нибудь практическую задачу. Например научимся готовить тексты статей для Хабра с минимумом ручной работы.
Прикинем, что нам нужно:
- Преобразование текста в HTML
- Спеллчекер
- Подсветка синтаксиса текстов программ разных языков
Приступаем.
Преобразование текста в HTML: режим muse
Самый традиционный UNIX-вэй. Суть в том, что пишем статью в текстовом виде, соблюдая некоторые соглашения, достаточно простые, такие простейшие правила разметки, а потом обрабатываем этот текст парсером, который превращает наш текст в HTML файл, который мы и вставляем в форму редактирования статьи Хабра.
Установка
В Debian/Ubuntu пакет с этим режимом называется muse-el. Итак:
apt-get muse-el
В .emacs добавляем:
(require 'muse) (require 'muse-html)
Теперь можно включать режим muse:
M-x muse-mode
Разметка
Разметка при работе с muse очень простая, так например если строку начать со звездочки, или несокольких, при трансляции muse превратит эту строку в заголовок с уровнем, равным количеству звездочек. Например так:
* Заголовок первого уровня ** Заголовок второго уровня
Для того, чтобы сделать параграф, нужно оставить пустую строку в
тексте. Для того, чтобы выделить слово, надо обрамить его одной, двумя
или тремя звездочками:
*выделенное слово* **сильнее** ***еще сильнее*** _подчеркнутое_ =моноспейс=
выделенное слово сильнее еще сильнее подчеркнутое
моноспейс
Можно делать таблицы:
Двойноя черта || Разделяет поля заголовка Одиночная черта | Разделяет поля тела таблицы Еще один ряд | тела таблицы Тройная черта || Разделяет поля футера
Двойноя черта | Разделяет поля заголовка |
---|---|
Одиночная черта | Разделяет поля тела таблицы |
Еще один ряд | тела таблицы |
Спеллчекер: flyspell
В Ubuntu 9.04 flyspell входит в emacs. Так что:
M-x flyspell-mode
и спеллинг проверяется на лету.
Форматирование исходных текстов программ: muse + python
Есть встроенный перевод исходных текстов программ в HTML при помощи пакета htmlizer.el, но к сожалению в Хабре такой HTML не показывается. Придется извращаться.
Хорошо переводит исходники в HTML утилита code2html, но ее выход нужно немножко подправить, чтобы текст программы хорошо выглядел в Хабре. А именно, вставить вместо лидирующих пробелов &nobsp;
Для этого пишем небольшую функцию на Python. Затем в текст статьи вставляем тэг вызова интерпретатора питона, текст программы и вызов нашей функции, Примерно так:
<python markup=""> import srcform src = """ i = 1 while i < 10: print i i += 1 """ srcform.src_form('code2html -lpython -H -t4',src) </python>
Результат работы:
i = 1
while i < 10:
print i
i += 1
Преобразование в HTML
M-x muse-publish-this-file Publish with style: html
Проблемы
При работе с muse пришлось встретится с некоторыми проблемами.
1. В режиме muse-mode в faces для отображения заголовков указан фонт helv. Но в нем нет русских символов. Если кастомизируем faces, muse при включении все равно переписывает значения настроек для faces. Пришлось сделать функцию-обертку, в которой после установки режима muse-mode опять переконфигурируются faces.
2. Хабр не отображает одиночную цифру 0 (ноль), расцвеченную таким образом.
В комментах alexott подсказал решение проблемы 1. Нужно в face 'variable-pitch' заменить фонт 'helv' на какой-нибудь другой, например 'fixed-misc' или 'arial'.
Если кто не знает, то делается это легче всего так. Набираем команду:
M-x describe-face variable-pitch
В полученном описании face щелкаем по ссылке '(customize this face)'. В появившемся буфере кастомизации меняем значение в поле 'Font family' с 'helv' на то, что Вам нужно, например на 'arial'. Теперь нажимаем на кнопочку 'Save for Future Sessions'. Команды изменения face будут дописаны в конец Вашего файла .emacs .
Приложение
Текст скрипта для вызова утилиты.
import subprocess
def src_form(command,in_src):
in_str = in_src
proc = subprocess.Popen([command],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
stdout_value = proc.communicate(in_str)[0]
lines_in = stdout_value.splitlines()
lines_out = []
print "<literal>"
for line in lines_in:
l_out = ""
l_out = line.lstrip()
spaces = len(line) - len(l_out)
for j in xrange(spaces):
l_out = " " + l_out
print l_out
print "</literal>"