Оскільки мені було цікаво, наскільки добре це буде працювати, я щось разом зламав подібні твори.
Як зазначалося в коментарях до попередньої відповіді, єдиний спосіб зробити це - заповнити регіони пробілами; саме це ми і робимо; перед тим, як писати, ми видаляємо ці пробіли, тому ви не повинні заважати нікому іншим.
Зауважте, що цей приклад дуже специфічний для філейного типу розмітки!
Побічні ефекти :
- Копіювання тексту також скопіює багато пробілів
- Використання $та Endбільше не працює так, як очікувалося (це переходить у стовпець 80), а клавіші, такі як
jі kтакож поводяться по-різному.
- Фон не відображається, коли
'list'
ввімкнено
- Повністю порожні рядки не працюють, вам потрібно вручну додати вкладку або 4 пробіли
- ... Можливо, більше?
По-перше, вам потрібно додати це до свого ~/.vim/after/syntax/markdown.vim
:
syn clear markdownCodeBlock
syn region markdownCodeBlock start=" \|\t" end="$"
hi def markdownCodeBlock ctermbg=230 guibg=lightyellow
Ви, звичайно, можете налаштувати кольори на свій смак ;-)
Потім додайте це до свого vimrc:
fun! MarkdownBlocks()
fun! s:fill(line)
" Remove all trailing whitespace
let l:line = substitute(a:line, " *$", "", "")
" Add trailing whitespace up to 'textwidth' length
return l:line . repeat(' ', (&tw > 0 ? &tw : 80) - strdisplaywidth(l:line))
endfun
" Get all lines in a list
let l:lines = getline(1, line('$'))
" Map s:fill() to the lines that are a code block
call map(l:lines, 'v:val[0] == "\t" || v:val[:3] == " " ? s:fill(v:val) : v:val')
" Reset the buffer to the lines
call setline(1, l:lines)
endfun
" Remove all the trailing spaces
fun! MarkdownBlocksClean()
let l:save_cursor = getpos(".")
silent %s/^\( \|\t\)\(.\{-}\)\( *\)$/\1\2/e
call setpos('.', l:save_cursor)
endfun
au BufWritePre *.markdown call MarkdownBlocksClean()
" Set spaces on loading the file, leaving insert mode, and after writing it
au FileType markdown call MarkdownBlocks()
au InsertLeave *.markdown call MarkdownBlocks()
au BufWritePost *.markdown call MarkdownBlocks()
Я не збираюся пояснювати код по черзі, коментарі повинні чітко пояснювати його ;-)