Как стать автором
Обновить

VIM: Расширим и углубим себе на пользу

Время на прочтение2 мин
Количество просмотров1.1K
Пара функций и команда (command) vim'а в помощь блоггеру.

Что они делают?
Меняют двойной минус и минус с пробелом по краям на неразрывный пробел с длинным тире ( —), кавычки «секунды» на кавычки «елочки».

Как этим пользоваться?
Скопировать код в свой .vimrc, открыть vim, написать:
Привьет, менья зовут "E-Type" −- на здоровье!

Затем в коммандном режиме:
:HTMLLineRU<CR>

где
 -- это нажатие на Enter.
Результатом команды будет окно с таким вот нехитрым содержимым:
Привьет, менья зовут &laquo;E-Type&raquo;&nbsp;&mdash; на здоровье!

Что в свою очередь вашим любимым браузером покажется как:

Привьет, менья зовут «E-Type» — на здоровье!


Сам код:
" HTML typo {{{
"" Convert text line to HTML line
function! HTMLLineRU(line)
    "" convert to hello — world:
    "" hello −- world
    "" hello--world
    "" hello - world
    let patt = '\(\s*--\s*\)\|\( - \)\|\(\s*—\s*\)'
    let line = substitute(a:line, patt, '\&nbsp;\&mdash; ', "g")

    "" «russian quotes»
    "" convert "hello world" to «hello world»
    let patt_match = '"\zs.\{-}\ze"'
    let patt_subs = '".\{-}"'
    let matched = matchstr(line, patt_match)
    while matched != ""
        let line = substitute(line, patt_subs, '\&laquo;'.escape(matched, '\&*[]?%').'\&raquo;', "")
        let matched = matchstr(line, patt_match)
    endwhile
    let patt = '«'
    let line = substitute(line, patt, '\&laquo;', "g")
    let patt = '»'
    let line = substitute(line, patt, '\&raquo;', "g")

    return line
endfunction

function! HTMLLines(line1, line2)
    let sourceLines = getline(a:line1, a:line2)
    if bufloaded("scratch_html_lines")
        :bdelete html_lines
    endif

    :new scratch_html_lines
    :setlocal buftype=nofile
    :setlocal noswapfile

    let lineidx = 1
    for line in sourceLines
        call setline(lineidx, HTMLLineRU(line))
        let lineidx+=1
    endfor
endfunction

command! -range=% HTMLLineRU call HTMLLines(expand(<line1>), expand(<line2>))

" }}}


PS
По умолчанию обрабатывается весь текущий буфер, но можно выделить несколько строк и для них тоже все будет хорошо. :)

PPS
Достаточно легко можно добавить обработку мини wiki синтаксиса, например, чтобы *вот это вот* превращалось в вот это вот.

PPPS
Кто знает как заставить vim печь пироги? :)
Теги:
Хабы:
+5
Комментарии2

Публикации