пʼятницю, 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 выполнял нужное автодополнение.

Заключение

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

понеділок, 20 жовтня 2014 р.

Визуализация режима для Zsh Vi Mode

Как известно, для zsh можно включить vim-режим для ввода команд. Однако, существует проблема: не всегда можно быстро понять в каком режиме находишься  - NORMAL или INSERT. Это проблему можно побороть, например, добавив в правую часть приглашения визуализацию текущего режима. Для этого надо добавить в .zshrc:
function zle-line-init zle-keymap-select {
    VIM_PROMPT="%{$fg_bold[yellow]%} [% NORMAL]%  %{$reset_color%}"
    RPROMPT="${${KEYMAP/vicmd/$VIM_PROMPT}/(main|viins)/} $EPS1"
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

Идея взята здесь

четвер, 16 жовтня 2014 р.

Мини-обзоры Vim-скриптов. Часть III: smartpairs - умное выделение текстовых объектов.

Как известно, Vim содержит серию команд для выделения текстовых объектов.
Например, команда va" выделяет фрагмент текста между ближайшими к курсору кавычками ("), включая их,  а vi" - не включая. Помимо " могут также использоваться символы:
<, >, ", ', `, (, ), [, ], {, } или t для HTML(XML)-тегов и ряд других.
Таким образом можно не только выделять текстовые объекты, но и выполнять над ними действия, т.е. использовать команды c, d, y.

Скрипт smartpairs.vim упрощает работу с текстовыми объектами.

Во-первых, при его использовании вместо перечисленных выше символов достаточно после, например, vi нажать еще раз v (клавишу, конечно же можно переопределить). Скрипт ищет ближайшую пару символов к текущему положению курсора и обрабатывает получившийся текстовый объект. Если еще раз нажать v, скрипт найдет следующую пару символов и расширить границы текущего текстового объекта.

Во-вторых, для более быстрого выделения текстового объекта можно использовать команду vv.

В-третьих,  используемый по умолчанию Uber-режим чередует i- и a- команды над текстовыми объектами.

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

Предыдущие обзоры:
Мини-обзоры Vim-скриптов. Часть I: startify & rooter
Мини-обзоры Vim-скриптов. Часть II: Headlights - меню установленных плагинов

вівторок, 14 жовтня 2014 р.

Поддержка интерактивных нотификаций iOS 8 в приложении

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

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

Мини-обзоры Vim-скриптов. Часть II: Headlights - меню установленных плагинов

Продолжу обзор используемых Vim-плагинов.

При большом количестве установленных Vim-плагинов очень легко подзабыть как вызывать ту или иную команду или привязку клавиш, предоставляемую каким-нибудь скриптом. Справиться с этой проблемой поможе скрипт Headlights. Он создает gVim-меню из всех установленных плагинов - по одному пункту на каждый плагин. Для каждого пункта этого меню создается при возможности подменю состоящее из команды вызова помощи для данного плагина, список команд и список привязок клавиш:


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

Предыдущие обзоры:
Мини-обзоры Vim-скриптов. Часть I: startify & rooter

середу, 8 жовтня 2014 р.

Мини-обзоры Vim-скриптов. Часть I: startify & rooter

Решил наваять ряд мини-обзоров Vim-скриптов, которые я  использую.
Первые: vim-startify и vim-rooter. Обзор получился не очень мини, поэтому вот ссылка на статью на Хабре

понеділок, 6 жовтня 2014 р.

Мой вклад в сниппеты для Vim

Для Vim есть замечательный набор сниппетов. В том числе и для python.  Я добавил еще два: для  classmethod и staticmethod. Мой pull-request уже принят. Так что новыми сниппетами можно пользоваться.

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

Vim-plugin для быстрого открытия домашней страницы плагина

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