пʼятницю, 24 жовтня 2014 р.

Ведение блога на Blogger с помощью Vim

Введение

В последнее время я стал активно гадить писать посты в Blogger. Естественно, захотелось настроить правильный инструмент для упрощения себе жизни. Основных цели было две:
  • упрощение процесса редактирования
  • возможность подготовки черновиков постов в офф-лайн
Для Vim существует несколько плагинов, например Blogger.vim. Однако, у меня он не заработал, выдавая какую-то ошибку.
Основой моих настроек для Vim’а послужила вот эта статья.

Установка скрипта для постинга и его настройка

В указанной выше статье описан скрипт b.py. Скрипт позволяет подготавливать тексты в формате Markdown или reStructuredText. Установка скрипта и необходимых зависимостей описана в документации. Ему необходим конфигурационный файл brc.py подобного содержания:
import re
service = 'blogger'
service_options = {
    'blog': YOUR_BLOG_ID
}
handlers = {
    'Markdown': {
        'match': re.compile(r'.*.(blog|markdown|md(own)?|mkdn?)$'),
        'module': 'bpy.handlers.mkd',
        'options': {
            'config': {
                'extensions': ['footnotes', 'toc'],
            },
            'smartypants': True,
        },
    }
}

С помощью строки
'match': re.compile(r'.*.(blog|markdown|md(own)?|mkdn?)$')
я настраиваю скрипт таким образом, чтобы он воспринимал также файлы с расширением blog.
После подготовки конфига необходимо выполнить авторизацию, как описано в документации. В результате в этом же каталоге будет создан файл b.dat с нужным токеном. Скрипт b.py нужно обязательно запускать из каталога, содержащего файлы brc.py и b.dat.

Установка нужного filetype и подсветки синтаксиса

Файл поста - это частный случай Markdown-файла, поэтому я добавил в ~/.vim/ftdetect/ftdetect.vim следующую строку:
au BufRead,BufNewFile *.blog    set filetype=blog syntax=markdown
Таким образом я сообщаю Vim’у что тип файла будет blog, а вот для подсветки синтаксиса использовать те же правила, что и для Markdown-файлов.

Шаблон нового файла

Скрипт требует, чтобы каждый новый файл поста имел следующий заголовок
!b
service: blogger
title: Some title
labels: List of tags
(после публикации в заголовок будет добавлен ещё ряд полей). Для задания шаблонов создаваемых файлов я использую плагин aperezdc/vim-template. Поэтому добавил в каталог для ведения блога файл .vim-template:*.blog:
!b
service: blogger
title: %FILE%
labels: productivity, Vim, programming


%HERE%

После этого для создания нового поста необходимо ввести команду:
mvim "Ведение блога на Blogger с помощью Vim.blog"
(имя файла становится заголовком поста).

Настройки маппинга

В статье приводится настройка нескольких маппингов для:
  • публикации поста
  • создания html-файла для предварительного просмотра
  • проверки валидности ссылок, упоминаемых в посте
Я оставил только первый, создав файл ~/.vim/ftplugin/blog.vim:
set autoread
map <buffer> <leader>post :exec '!b.py post '.shellescape(expand('%:p'))

Проверку ссылок я не делал, так как предлагаемый автором статьи способ не соответствует идеологии Vim (по-хорошему, проверку следует настроить через makeprg). К тому же, ссылки, как правило, вставляются с помощью копирования, поэтому в проверке валидности особенного смысла нет.
Как было указано ранее, скрипт после публикации поста добавляет в файл дополнительные заголовки. Опция set autoread заставляет Vim автоматически перечитывать файл после его изменения извне.

Snippets

Для подсветки синтаксиса в блоге я использую highlight.js. Естественно, вручную каждый раз вводить <pre><code>...</code></pre> некомильфо. Целесообразно это делать с помощью какого-нибудь сниппета. С другой стороны, как отмечалось выше, файл поста - это частный случай Mardown-файла, поэтому было бы неплохо использовать также сниппеты для таких файлов. С этой целью я создал следующий UltiSnip-файл:
extends markdown

snippet code "code fragment"
<pre><code class="${1:python}">$0
</code></pre>
endsnippet

Дополнительные улучшения

Чтобы ещё больше упростить вставку в текст блога файлов целиком (избежать цепочки действий: написать <pre>… - открыть файл - скопировать - вставить) я написал такую функцию и команду:
func! s:InsertCode(file_name)
    let code_lang = substitute(a:file_name, '[^\.]*\.', '', 'i')
    call setline('.', getline('.').'<pre><code class="'.code_lang.'">')
    norm! o
    call setline('.', getline('.').'</code></pre>')
    norm! k
    exec "r ".a:file_name
endfu

command! -nargs=1 -complete=file Rc call s:InsertCode(<f-args>)

Так как аргументом команды является имя файла, то я указал -complete=file, чтобы Vim при нажатии на Tab выполнял нужное автодополнение.

Заключение

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

Немає коментарів:

Дописати коментар