Como tenía curiosidad por saber qué tan bien funcionaría, he pirateado algo que funciona.
Como se mencionó en los comentarios sobre la respuesta anterior, la única forma de hacerlo es llenar regiones con espacios; que es exactamente lo que hacemos; antes de escribir, eliminamos estos espacios, por lo que no debería molestar a nadie más con él.
¡Tenga en cuenta que este ejemplo es muy específico para el tipo de archivo markdown!
Efectos secundarios :
- Copiar texto también copiará muchos espacios
- Usando $y Endya no funciona como se esperaba (va a la columna 80), y las teclas como
jy ktambién se comportan de manera diferente.
- El fondo no se muestra cuando
'list'
está habilitado
- Las líneas completamente en blanco no funcionan, debe agregar manualmente una pestaña o 4 espacios
- ... ¿Quizás más?
Primero, necesita agregar esto a su ~/.vim/after/syntax/markdown.vim
:
syn clear markdownCodeBlock
syn region markdownCodeBlock start=" \|\t" end="$"
hi def markdownCodeBlock ctermbg=230 guibg=lightyellow
Puede ajustar los colores a su gusto, por supuesto ;-)
Luego, agregue esto a su 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()
No voy a explicar el código línea por línea, los comentarios deberían dejar en claro la esencia general del mismo ;-)