Parce que j'étais curieux de savoir comment cela fonctionnerait, j'ai piraté quelque chose ensemble ce genre de travaux.
Comme mentionné dans les commentaires sur la réponse précédente, la seule façon de le faire est de remplir les régions avec des espaces; c'est exactement ce que nous faisons; avant d'écrire, nous supprimons ces espaces, vous ne devriez donc pas déranger qui que ce soit d'autre.
Notez que cet exemple est très spécifique pour le type de fichier Markdown!
Effets secondaires :
- La copie de texte copiera également de nombreux espaces
- Utiliser $et Endne fonctionne plus comme prévu (il va à la colonne 80), et des clés telles que
jet kse comportent également différemment.
- L'arrière-plan ne s'affiche pas lorsque
'list'
est activé
- Les lignes complètement vides ne fonctionnent pas, vous devez ajouter manuellement une tabulation ou 4 espaces
- ... Peut-être plus?
Tout d'abord, vous devez l'ajouter à votre ~/.vim/after/syntax/markdown.vim
:
syn clear markdownCodeBlock
syn region markdownCodeBlock start=" \|\t" end="$"
hi def markdownCodeBlock ctermbg=230 guibg=lightyellow
Vous pouvez bien sûr ajuster les couleurs à votre guise ;-)
Ensuite, ajoutez ceci à votre 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()
Je ne vais pas expliquer le code ligne par ligne, les commentaires devraient clarifier l'essentiel général ;-)