Что новенького:
- Добавил команды :VimwikiGoHome, :VimwikiTabGoHome и :VimwikiExploreHome.
- Добавил маппинг <Leader>wt — откроет индексный файл в новом табе.
- Добавил настройку g:vimwiki_gohome — меняет поведение команды :VimwikiGoHome. Подробнее в справке. (Спасибо Тимуру Зарипову).
- Исправил команду :VimwikiRenameWord. Можно было потерять переименовываемый файл, если текущая директория отличалась от g:vimwiki_home.
- Сделал команды :Wiki2HTML и :WikiAll2HTML доступными только для буферов c ft=vimwiki.
- Ну и переименовал их в :Vimwiki2HTML и :VimwikiAll2HTML.
Загрузить можно, как обычно, с сайта vim’а или с сайта vimwiki.
В этот замечательный день, аккурат в день юриста, я забубенил новую версию.
Из нового:
- Написал Help.
- Сделал фолдинг для заголовков.
- Добавил <Plug>VimwikiGoHome и <Plug>VimwikiExploreHome, чтоб их можно было нормально перебиндить.
- Исправил парочку ошибок.
Загрузить можно с сайта vim’а (там и проголосовать можно) или с сайта vimwiki, где есть картинки, которые скриншоты.
PS
Юристы! С праздником!
Забубенил новую версию vimwiki под номером 0.5. Поправил несколько не критичных ошибок, думаю, что добавил немного новых — все как обычно.
Теперь можно добавлять разные Wiki-разметки. Я пока сделал гугловскую и MediaWiki. Правда, экспорт в HTML работает только для стандартной — vimwiki, что в будущем возможно изменится.
Так случилось, что мне необходимо в некоторых файлах записывать дату их изменения (вот как здесь, например). До недавних пор использовал:
nmap <Leader>Id i<C-R>=strftime("%d.%m.%Y %H:%M")<CR><ESC>
nmap <Leader>id a<C-R>=strftime("%d.%m.%Y %H:%M")<CR><ESC>
vmap <Leader>id di<C-R>=strftime("%d.%m.%Y %H:%M")<CR><ESC>
Я находил старую дату — обычно где-то в самом начале файла — удалял ее и вставлял новую.
Делал так достаточно долго, хоть это было и не очень удобно. Пока не надоело:
function! LastChangeUpdate(...)
if a:0 > 0
let prefix = a:1
else
let prefix = ""
endif
let linenr = 1
while linenr <= 10
if getline(linenr)=~ "Last Change"
call setline(linenr, prefix.'Last Change: '.strftime("%d.%m.%Y %H:%M"))
break
endif
let linenr += 1
endwhile
endfunction
"" Before _vimrc is saved, update 'Last Change' time if it is exists.
autocmd! bufwritepre $MYVIMRC call LastChangeUpdate('" ')
autocmd bufwritepre *.vim call LastChangeUpdate('" ')
Функция LastChangeUpdate тупо смотрит на первые 10 строк файла. Если находит ту, в которой есть Last Change, то заменяет ее на нужное нам — Last Change: текущая дата и время. Если в параметрах функции задана строка, то она подставляется перед Last Change, чтобы оформить как комментарий, например.
Ну и автокоманды — для vimrc и для всех vim-файлов перед записью вызывается наша функция и делает описанное выше.
Как-то внезапно люди стали присылать патчи для vimwiki, что конечно радует.
Думаю сделать возможным подключение разных вики синтаксисов (уже начал). Основная засада видится в обработке «сложных» вики-ссылок. Другая засада в самом коде — там местами такое написано, что стыдно становится. Тестов я не писал — посчитал не нужными, теперь, рефакторинг, вместо чего-то не сильно напряжного, превратится в «кашмар».
Посмотрим, что получится.
Читая группу vim_use, узнал, что vim’овский omni completion (который есть простенький аналог intelliSense) умеет закрывать html тэги.
Пример:
<table> </<C-X><C-O>
<C-X><C-O> закроет table
Можно, конечно, использовать скрипт closetag.vim. Там, для закрытия тэга, писать </ не надо — это плюс. Правда его нужно устанавливать отдельно — это минус.
Я, скорее всего, откажусь от closetag’а и буду использовать omni completion.
Примерно так:
imap <C-_> </<C-X><C-O>
Нажимаешь <C-_> — открытый тэг закрыватся.
Тем кто пишет на Лиспе (Схеме) в Виме может быть интересен скрипт, закрывающий открытые скобки (unbalanced parens). Ничего особенного в нем нет — со своей работой справляется. Однако функция s:isInLispExpression() тупая как пробка, ее нужно еще тюнить и тюнить.
" Lisp stuff {{{
"" Close parens
function! s:isInLispExpression(linenr) " {{{
let result = 1
if a:linenr < 0
let result = 0
else
let line = getline(a:linenr)
if line == ""
let result = 0
endif
endif
return result
endfunction " }}}
function! s:LispCountOpenedParens(line) "{{{
let unbalanced = 0
let idx = 0
while idx < len(a:line)
if a:line[idx] == '('
let unbalanced += 1
elseif a:line[idx] == ')'
let unbalanced -= 1
endif
let idx += 1
endwhile
return unbalanced
endfunction "}}}
function! s:LispCloseParens(linenr) "{{{
let unbalanced = 0
let lineidx = a:linenr
while s:isInLispExpression(lineidx)
let line = getline(lineidx)
let unbalanced += s:LispCountOpenedParens(line)
let lineidx -= 1
endwhile
if unbalanced > 0
execute "normal ".unbalanced."A)\<ESC>"
endif
endfunction "}}}
command! LISPCloseParens call <SID>LispCloseParens(line('.'))
map <Leader>) :LISPCloseParens<CR>
"" }}}
Upd.
Написал улучшенный вариант “балансировки” скобок.
На работе выдалась свободная минутка, засел за конвертер wiki разметки в html. Мозг приходится напрягать, да. Пока получается вот что:


Тут, было дело, написал плагин к любимому текстовому редактору emacs vim. Называется он vimwiki и позволяет писать связанные друг с другом текстовые файлы — получился персональный wiki. Написал, опубликовал на офф-сайте, и теперь каждый день смотрю как он там поживает, сколько раз скачали, какой рейтинг ему поставили — беда.
В общем, тамагочи получился.