пятница, 9 ноября 2012 г.

vim: плагин Vimwiki

После перехода из Gnome 3 на MATE встала задача перенести наработанные заметки из gnote в mnote. Задача, как это ни странно, оказалась непосильной. И поэтому я принял решение завязать с использованием десктоп-зависимых приложений для хранения заметок и найти им замену среди плагинов vim. Самым популярным плагином в vim.org, найденным по ключевому слову wiki, оказался vimwiki. Первые шаги в его использовании очень просты: запускаем vim, набираем \ww, подтверждаем, что рабочей директорией vimwiki будет $HOME/vimwiki (или выбираем другую) и можно приступать к редактированию индексной страницы.

Я не хочу вдаваться в подробности редактирования страниц в vimwiki - для этого имеется неплохая документация, да и сам я пока не набрал достаточного опыта. Хочу лишь отметить, что возможности и уровень юзабилити vimwiki весьма высоки: работать с ним действительно приятно и удобно. Дочерние страницы создаются простым нажатием на клавишу Enter, синтаксическая подсветка радует глаз, удобная навигация по иерархии страниц, возможность экспорта в HTML, независимая подсветка фрагментов кода в соответствии с языком, ссылки на ресурсы (в том числе на локальные файлы), которые открываются во внешней программе в соответствии с их типом. Правда, в последнем случае обнаружилась и ложка дегтя: для открытия файлов во внешней программе vimwiki использует команду silent !xdg-open, которая портит терминал (возможно, только у меня), и для того, чтобы вернуть его в нормальное состояние, нужно ввести Ctrl-L. Но это проблема не vimwiki, a vim, да и открывать картинки из vim я не собираюсь.

Ниже я привожу настройки, которые я добавил в файл .vimrc для vimwiki.
" ---- Vimwiki settings
" ----
let g:WikiGlobal = {}
let g:WikiGlobal.nested_syntaxes = {'c''c''c++': 'cpp', 'perl''perl',
            \ 'python''python''sh''sh'}
let g:vimwiki_list = [g:WikiGlobal]

" disable concealing of short links
let g:vimwiki_url_maxsave = 42

" redefine original <C-Up> and <C-Down> mappings in vimwiki buffers
nmap <silent> <Leader>wn <Plug>VimwikiDiaryNextDay
nmap <silent> <Leader>wp <Plug>VimwikiDiaryPrevDay

" add schemes 'vlocal:' and 'vfile:' to open files in a new tab
fun! VimwikiLinkHandler(link)
    let link = a:link
    if link =~ "vlocal:" || link =~ "vfile:"
        let link = link[1:]
    else
        return 0
    endif
    let [idx, scheme, path, subdir, lnk, ext, url] =
                \ vimwiki#base#resolve_scheme(link, 0)
    if g:vimwiki_debug
        echom 'LinkHandler: idx='.idx.', scheme=[v]'.scheme.', path='.path.
                \ ', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url
    endif
    if url == ''
        echom 'Vimwiki Error: Unable to resolve link!'
        return 0
    else
        call vimwiki#base#edit_file('tabnew', url, [], 0)
        return 1
    endif
endfun
Переменная g:WikiGlobal нужна в данном случае только для определения независимой подсветки фрагментов кода внутри страниц (кстати, обратим внимание на некорректную подсветку синтаксиса в районе 'c++': 'cpp'). Например, фрагмент
{{{c++
int main( void )
{
    return 0;
}
}}}
корректно подсвечен как исходник на C++.

Также я увеличил значение переменной g:vimwiki_url_maxsave до 42, чтобы ссылки на ресурсы не срезались до очень коротких, переопределил маппинги для VimwikiDiaryNextDay и VimwikiDiaryPrevDay, которые изначально соответствовали <C-Down> и <C-Up> (а эти комбинации клавиш я использую для навигации между окнами), и добавил функцию-обработчик нажатия на ссылки VimwikiLinkHandler(), в которой определена обработка новых типов ресурсов vlocal и vfile. Дело в том, что по умолчанию vimwiki открывает ссылки на файлы (они соответствуют типам ресурсов local и file) во внешней программе (как я уже говорил, с помощью xdg-open). Ну а обработчик VimwikiLinkHandler() будет открывать ресурсы новых типов vlocal и vfile в отдельной вкладке. Исходный код данного обработчика приведен в документации vimwiki, что подтверждает ее высокий уровень.

Все это здорово, но хотелось бы запускать vimwiki сразу из командной строки. Сделать это просто. Поместим в .bashrc простую функцию:
function vimwiki
{
    if (( $# == 0 )) ; then
        vim -c VimwikiIndex
        return
    fi
    if [ $1 = "-l" ] ; then
        local columns=`stty size | cut -d' ' -f2`
        for in $HOME/vimwiki/*.wiki ; do
            echo `basename $i` | sed 's/\.wiki$//'
        done | COLUMNS=$columns column
        return
    fi
    vim -c VimwikiIndex -c "VimwikiGoto $1"
}
Теперь в нашей оболочке появилась новая команда vimwiki. Если запустить ее без параметров, то откроется индексная страница vimwiki. Кроме того, эта команда позволяет вывести список всех страниц vimwiki, если ей передан аргумент -l (в предположении, что рабочей директорией vimwiki является $HOME/vimwiki), а также открыть vim на определенной странице, когда имя страницы передано ей в первом аргументе.

Комментариев нет:

Отправить комментарий