Skip to content

Commit f5436fc

Browse files
committed
Merge pull request #3 from vitalk/indented-fanced-blocks
Indented fanced blocks - Detect indented fenced code blocks in gfm; - Automatically indent/dedent block when sync changes between buffers;
2 parents 40b966a + 99ad812 commit f5436fc

File tree

2 files changed

+50
-16
lines changed

2 files changed

+50
-16
lines changed

autoload/fancy.vim

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ fun! s:get_id()
2424
return s:id
2525
endf
2626

27+
fun! s:indent_line(line, indent)
28+
return printf('%*s%s', a:indent, a:indent ? ' ' : '', a:line)
29+
endf
30+
31+
fun! s:dedent_line(line, indent)
32+
return substitute(a:line, '^\s\{'.a:indent.'\}', '', '')
33+
endf
34+
35+
fun! s:indent_lines(lines, indent)
36+
return a:indent < 0
37+
\ ? map(lines, 's:dedent_line(v:val, indent)')
38+
\ : map(lines, 's:indent_line(v:val, indent)')
39+
endf
40+
2741
" }}}
2842
" Buffer prototype {{{
2943

@@ -104,9 +118,23 @@ fun! s:buffer_write(...) dict abort
104118
return setline(lnum, text)
105119
endf
106120

121+
" Returns the buffer content with or without indentation.
122+
"
123+
" The arguments are:
124+
" - the indentation level (dedent buffer when value is negative and indent otherwise)
125+
" - the line number to start (read from the beginning if not set)
126+
" - the line number to end (process until the end if not set)
127+
fun! s:buffer_indent(indent, ...) dict abort
128+
let start_at = a:0 ? a:1 : 1
129+
let end_at = (a:0 > 1) ? a:2 : '$'
130+
return a:indent < 0
131+
\ ? map(self.read(start_at, end_at), 's:dedent_line(v:val, a:indent)')
132+
\ : map(self.read(start_at, end_at), 's:indent_line(v:val, a:indent)')
133+
endf
134+
107135
call s:add_methods('buffer', [
108136
\ 'getvar', 'setvar', 'name', 'delete', 'read', 'write',
109-
\ 'exists', 'spec', 'path', 'fancy_id'
137+
\ 'exists', 'spec', 'path', 'fancy_id', 'indent'
110138
\ ])
111139

112140
" }}}
@@ -140,7 +168,8 @@ fun! s:fancy() abort
140168
\ 'options': search_options,
141169
\ 'start_at': start_at,
142170
\ 'end_at': end_at,
143-
\ 'buffer': s:buffer()
171+
\ 'buffer': s:buffer(),
172+
\ 'indent_level': indent(start_at)
144173
\ }
145174
call extend(fancy, s:fancy_prototype, 'keep')
146175

@@ -160,7 +189,10 @@ fun! s:fancy_filetype() dict abort
160189
endf
161190

162191
fun! s:fancy_text() dict abort
163-
return self.buffer.read(self.start_at + 1, self.end_at - 1)
192+
return self.buffer.indent(
193+
\ -self.indent_level,
194+
\ self.start_at + 1,
195+
\ self.end_at - 1)
164196
endf
165197

166198
fun! s:fancy_destroy() dict abort
@@ -219,14 +251,15 @@ fun! s:edit()
219251
endf
220252

221253
fun! s:destroy(...)
222-
let bufnr = a:0 ? str2nr(a:1[0]) : '%'
254+
let bufnr = a:0 ? a:1[0] : '%'
223255
let buffer = s:buffer(bufnr)
224256
let fancy = s:lookup_fancy(buffer.fancy_id())
225257
call fancy.destroy()
226258
endf
227259

228-
fun! s:sync()
229-
let buffer = s:buffer()
260+
fun! s:sync(...)
261+
let bufnr = a:0 ? a:1[0] : '%'
262+
let buffer = s:buffer(bufnr)
230263
let fancy = s:lookup_fancy(buffer.fancy_id())
231264

232265
" Go to original buffer.
@@ -239,7 +272,7 @@ fun! s:sync()
239272
if (fancy.end_at - fancy.start_at > 1)
240273
exe printf('%s,%s delete _', fancy.start_at + 1, fancy.end_at - 1)
241274
endif
242-
call append(fancy.start_at, buffer.read())
275+
call append(fancy.start_at, buffer.indent(fancy.indent_level))
243276

244277
" Restore the original cursor position.
245278
call setpos('.', fancy.buffer.pos)
@@ -248,8 +281,9 @@ fun! s:sync()
248281
let [fancy.start_at, fancy.end_at] = s:get_region_bounds(fancy.options)
249282
endf
250283

251-
fun! s:write()
252-
sil exe 'write! '.s:buffer().path()
284+
fun! s:write(...)
285+
let bufnr = a:0 ? a:1[0] : '%'
286+
sil exe 'write! '.s:buffer(bufnr).path()
253287
setl nomodified
254288
endf
255289

@@ -265,11 +299,11 @@ fun! fancy#edit() abort
265299
endf
266300

267301
fun! fancy#sync(...) abort
268-
return s:sync()
302+
return s:sync(a:000)
269303
endf
270304

271305
fun! fancy#write(...) abort
272-
return s:write()
306+
return s:write(a:000)
273307
endf
274308

275309
fun! fancy#destroy(...) abort

plugin/fancy.vim

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ let g:loaded_fancy = 1
1111
augroup fancy_files
1212
au!
1313
au BufWriteCmd fancy://** call fancy#write(expand('<amatch>'))
14-
au BufLeave fancy://** call fancy#sync()
15-
au BufWipeout fancy://** call fancy#destroy(expand('<abuf>'))
14+
au BufLeave fancy://** call fancy#sync(expand('<amatch>'))
15+
au BufWipeout fancy://** call fancy#destroy(expand('<amatch>'))
1616
au BufEnter fancy://**
1717
\ setl bufhidden=wipe bl noswapfile |
1818
\ nnore <buffer> q :write<bar>close<cr>
@@ -27,11 +27,11 @@ augroup END
2727
" Configuration {{{
2828

2929
let github_flavored_markdown = {}
30-
let github_flavored_markdown.start_at = '^```\w\+$'
31-
let github_flavored_markdown.end_at = '^```$'
30+
let github_flavored_markdown.start_at = '^\(\s\+\)\?```\w\+$'
31+
let github_flavored_markdown.end_at = '^\(\s\+\)\?```$'
3232
fun! github_flavored_markdown.filetype(fancy)
3333
let text = join(a:fancy.buffer.read(a:fancy.start_at, a:fancy.start_at), '\n')
34-
return substitute(text, '```', '', '')
34+
return substitute(text, '\(\s\+\)\?```', '', '')
3535
endf
3636

3737
let bitbucket_markdown = {}

0 commit comments

Comments
 (0)