Как конфертировать из VimOutliner в Markdown? - PullRequest
3 голосов
/ 23 марта 2012

Как я могу преобразовать VimOutliner файл в Markdown? Другими словами, я, как превратить контуры без табуляции, как это ...

Heading 1
    Heading 2
            Heading 3
            : Body text is separated by colons.
            : Another line of body text.
    Heading 4

... в заголовки в стиле хэша, разделенные пустой строкой, например:

# Heading 1

## Heading 2

### Heading 3

Body text.

## Heading 4

Я попытался определить макрос, но я довольно новичок в Vim (и не кодер), поэтому я до сих пор не добился успеха. Спасибо за любую помощь!

(PS - Что касается Markdown, я знаю о замечательном плагине VOoM , но я все еще предпочитаю делать начальные наброски для документов без видимых хеш-символов. Кроме того, мне также нравится способ VimOutliner выделяет разные уровни заголовков.)

1 Ответ

4 голосов
/ 23 марта 2012

Поместите эту функцию в ваш vimrc и просто используйте :call VO2MD() или :call MD2VO(), если необходимо.

function! VO2MD()
  let lines = []
  let was_body = 0
  for line in getline(1,'$')
    if line =~ '^\t*[^:\t]'
      let indent_level = len(matchstr(line, '^\t*'))
      if was_body " <= remove this line to have body lines separated
        call add(lines, '')
      endif " <= remove this line to have body lines separated
      call add(lines, substitute(line, '^\(\t*\)\([^:\t].*\)', '\=repeat("#", indent_level + 1)." ".submatch(2)', ''))
      call add(lines, '')
      let was_body = 0
    else
      call add(lines, substitute(line, '^\t*: ', '', ''))
      let was_body = 1
    endif
  endfor
  silent %d _
  call setline(1, lines)
endfunction

function! MD2VO()
  let lines = []
  for line in getline(1,'$')
    if line =~ '^\s*$'
      continue
    endif
    if line =~ '^#\+'
      let indent_level = len(matchstr(line, '^#\+')) - 1
      call add(lines, substitute(line, '^#\(#*\) ', repeat("\<Tab>", indent_level), ''))
    else
      call add(lines, substitute(line, '^', repeat("\<Tab>", indent_level) . ': ', ''))
    endif
  endfor
  silent %d _
  call setline(1, lines)
endfunction
...