Emacs для начинающих: Подготовка статей для Хабра в Emacs

    Введение


    Мы уже много говорили о мощи 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 = "&nbsp;" + l_out
            print l_out
        print "</literal>"

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 52

      0
      Это пробный комментарий
        +7
        Комментарий от 22 мая в посте от 17 июня оО. Круто попробовали.
        Или был черновик, там комментарий, а потом черновик превратили в нормальный пост?
          +1
          Да, именно так. Был черновик, на котором пробовал всякое, потом решил превратьть в пост, а про комментарий забыл.
            +26
            это Emacs позволяет писать комментарии из прошлого!)
              +5
              Идея с искуственным интелектов в emacs современных разработциков терпит фиаско. В результате была создана машина времени, для консультаций с разработчиками других времён…
          +2
          Очень нравится этот редактор. Радует переодичность ваших статей о emacs. Спасибо. Продолжайте в том же духе!
            +6
            Ты оскорбляешь emacs называя его редактором!!!
            0
            Другой уже напишет три статьи в MS Office / OpenOffice за то время пока один настраивает emacs.
              +4
              Этот один потом будет намного удобнее писать всё в одном emacs, пока те не задолбаются переключаться. Да и вообще, это хорошая тема для холивара — кому-то проще использовать стандартное и массовое, а кому-то настроенное под себя, необходимое.
                +4
                В случае emacs инвестиции окупаются стократ.
                +1
                Ждём ответа от vim'еров. :)
                  –4
                  Так ответ прост: у Emacs до сих пор наблюдается странная нелюбовь к UTF-8. Я вот его пробую каждые полгода, поддаваясь на распеваемые ему гимны, тыкаюсь по всяким менюшкам, пытаясь увидеть вместо квадратиков текст, ничего у меня не выходит, и я снова сажусь за vim. Да и легче vim гораздо. И плагины к нему теперь на ruby писать можно. Вот… Всё просто с ответом на вопрос: почему vim.
                    +1
                    О. Минусуют. Значит, таки оно как-то с UTF-8 работает. Может, ещё и расскажете о том, как подружить emacs с текстами в этой кодировке?
                      +2
                      Взять CVS-версию?
                        +1
                        Рекомендую попробовать 23ю версию.
                        0
                        Вообще, в моей практике, проблемы с кодировками решаются двумя строчками в конфигурационном файле:
                        ;; Установка правильного шрифта.
                        (set-frame-font "-xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso10646-1")
                        ;; Установка кодировки вставляемых строк.
                        (setq x-select-request-type 'UTF8_STRING)

                        Конечно, для отдельных режимов могут понадобится дополнительные настройки.
                          0
                          В emacs давно нет проблем с utf8 и шрифтами. Просто используйте emacs-23 (и выкиньте из конфига все, что относилось к настройке русского языка для прошлых версий) и добавьте в конфиг:
                          (set-default-font «DejaVu Sans Mono-11»)
                          (add-to-list 'default-frame-alist '(font. «DejaVu Sans Mono-11»))
                            0
                            'Давно нет'? Даже с учётом того, что последняя стабильная версия — это 22.3, вышедшая полгода назад?
                              0
                              emacs-23 давно уже есть.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Вот только что проверил. Дистрибутив Arch Linux, Emacs-22.3, шрифт DejaVu Sans Mono. Не работает… Попробовал разные шрифты, нормально рисуется только вместе с -misc-fixed-*. К чему бы это?
                                  • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Странно, у меня emacs ещё несколько лет назад, когда ещё убунты не было, из коробки открывал файлы в UTF-8.
                                0
                                Правда, стоит добавить, что не использую его, так как удовлетворяющего меня редактора там всё ещё нету.
                              +1
                              Аналогичная функциональность может быть достигнута через использование viki/deplate. Первое — позволяет внутри VIM организовать себе Вики, со стандартными Вики-форматированием:

                              *** Заголовок h3
                              __выделение__

                              Ну, а deplate это всё конвертит в html/LaTeX/DocBook.

                              www.vim.org/scripts/script.php?script_id=861
                              0
                              Давненько не могу добиться авторитетного ответа на простой вопрос. Очень надеюсь, что вы, как опытный emacs-пользователь, наконец мне поможете.

                              Умеет ли flyspell проверять орфографию в тексте, написанном на двух и более языках сразу?

                              PS: vim-7.x это умеет из коробки, без всяких лишних действий (Я более чем опытный пользователь vim, так что если у вас будут какие-то вопросы — с удовольствием отвечу).
                              PPS: Спасибо за статьи. С удовольствием почитываю.
                                0
                                Из коробки по-моему нет. Есть вроде autolang, но я не пробовал, и русский туда нужно добавлять самому.
                                +1
                                а как вы справляетесь с тем, что в кириллической раскладки большинство стандартных аккордов не работает?
                                  +2
                                  Используя не системный метод ввода, а Emacs'овый. C-x RET C-\
                                    0
                                    спасибо!
                                      0
                                      Имелось в виду переключение по «C-\»?
                                        0
                                        Угу, C-x RET C-\ позвляет выбрать конкретный метод. Я чаще пользуюсь им в последнее время, так как работаю с 3-мя и более языками одновременно, потому и описался. :)
                                      0
                                      bitbucket.org/mojo/emacs/src/tip/unicode-im.el

                                      Это я написал Emacs input mode с нормальной раскладкой на основе стандартного. Или стащил где-то в сети лет 10 назад. Уже не помню, а история потерялась при переходе CVS -> Subversion -> Mercurial.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                        0
                                        Есть по этому подводу зафайленый баг. Muse не должен портить кастомизацию faces, как я понимаю. Или я неправ?
                                        Кстати, не поделитесь рецептом подправления фонтов?
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Попробовал, получилось, спасибо, внесу изменения в статью.
                                            Слушай, а может Вы и печатать через printing русские тексты умеете?
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                0
                                                Ага, спасибо, вечером постараюсь попробовать.
                                              0
                                              Добавил Ваш способ в статью.
                                          +1
                                          всё это конечно здорово, но всё это не от хорошей жизни. На нормальных сайтах (e.g. Stack Overflow) писать текст — сплошное удовольствие. хабр всё ещё не торт
                                            0
                                            Markdown сложно конвертировать в обоих направлениях, они дублируют весь свой текст в html и markdown. С технической стороны это тоже не торт.
                                              0
                                              А вот я думаю, что это очень вкусный торт, ибо они ещё и хранят историю изменений. А с технической стороны проблем не вижу — хранить в двух форматах считаю вполне правильно, главное чтобы пользователю не было так больно.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              Я тоже постоянно пользуюсь org-mode, но с muse у меня получилось лучше, хотя может надо попробовать понастойчивей org-mode.
                                              И вроде со включением выхода скриптов там похуже.
                                              0
                                              Очень интересно, особенно про muse. Недавно задался вопросом замены word processor. LaTeX — это тяжеловато (крупный дистрибутив — как минимум) для моих нужд. Мне нужно было что-то с простейшим функционалом (бьютифаеры, абзацы/отступы, списки, заголовки, аннотации, содержание, нумерация страниц) и выводом в RTF (хотя бы). Пока ковырялся в области легких языков разметки (я VIM-ер, потому про расширения к Emacs даже как-то не подумал), лучшее, что нашел — txt2tags. Он достаточно простой и вроде активно развивается, но не выводит RTF и не имеет ряда нужных мне функций. Смотрел и другие языки (Markdown, REST и прочие), но ничего. Даже Lout (который неплох, но не выводит в RTF), groff (набор макросов mom, который совсем неплох, но почему-то всегда плохо конвертируется у меня даже в Post script, конвертацию в RTF еще даже не смотрел). Может, кто-нибудь что-нибудь подскажет? Лучше для VIM, но чем черт не шутит, можно и для emacs. =)
                                                0
                                                muse поддерживает как минимум html, latex, doc-book и texinfo.
                                                В дистрибутиве Debian/Ubuntu есть еще latex2rtf, если нужен именно rtf. Но сам я не пробовал.
                                                0
                                                Я так понимаю, строка:

                                                l_out = " " + l_out


                                                должна выглядеть примерно так:

                                                l_out = "&nbsp;" + l_out


                                                да?
                                                  0
                                                  Не совсем, в текстах программ как правило между операндами и символами бывает не больше одного символа пробела, а один символ пробела Хабр оставляет.
                                                  Но, Хабр ломает отступы. Т.е. нам, чтобы сохранить форматирование текста программы, необходимо сохранить количество пробелов между началом строки и первым непробелом.
                                                  Из программы на питоне:

                                                  for i in range(10):
                                                      print i
                                                  

                                                  Хабр сделает:

                                                  for i in range(10):
                                                  print i
                                                  

                                                  Можно заключить текст в тэг «pre», но тогда не получится подсветка.
                                                  Итак, строку:

                                                      print i
                                                  

                                                  Преобразуем в:

                                                  &nbsp;&nbsp;&nbsp;&nbsp;print i
                                                  


                                                    0
                                                    Так в исходнике в статье стоит пробел, а по логике должно стоять &nbsp;.
                                                  +1
                                                  Ну и однострочник на Perl'е для замены ведущих пробелов на  :

                                                  $ perl -e "while (<>) {s/^( +)/('&nbsp;' x length \$1)/e;print;}" file_name


                                                  Или если вызывать через pipe, то где-то вот так:

                                                  $ code2html -lperl -H -t4 source_file | perl -e "while (<>) {s/^( +)/('&nbsp;' x length \$1)/e;print;}"


                                                  Наверное, можно как-то через sed, но я что-то не соображу, как заменить пробелы на такое же количество &nbsp;.

                                                  З.Ы. Кстати, ввести символ неразрывного пробела в комментарии (вот так: &nbsp;) – большой геморрой.
                                                    0
                                                    если кто-то на маке будет пытаться делать попробуйте так:
                                                    python 2.5: proc.communicate(in_str)[] поменять на proc.communicate(in_str)[0]
                                                    также если будут проблемы с распознаванием code2html попробуйте прописать полный путь к bin (/usr/local/bin/code2html).
                                                    спасибо товарищу автору. приятный и полезный пост. мне не для хабра правда, но пригодится.

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                    Самое читаемое