codeblocks.vim 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. " vim: set fdm=marker et ts=4 sw=4 sts=4:
  2. function! markdown#codeblocks#InsideCodeblock(...) abort
  3. let origin_pos = getpos('.')
  4. if a:0 > 0
  5. let source_pos = a:1
  6. else
  7. let source_pos = line('.')
  8. endif
  9. call cursor(source_pos, 1)
  10. if synIDattr(synID(source_pos, 1, 0), 'name') =~? 'pandocdelimitedcodeblock'
  11. return 1
  12. endif
  13. let prev_delim = searchpair('^[~`]\{3}\s', '', '^[~`]\{3}', 'bnW')
  14. let next_delim = search('^[~`]\{3}', 'nW')
  15. call cursor(origin_pos[1], origin_pos[2])
  16. if prev_delim > 0
  17. if source_pos > prev_delim && source_pos < next_delim
  18. return 1
  19. endif
  20. endif
  21. endfunction
  22. function! markdown#codeblocks#Lang(...) abort
  23. let l:lang = ''
  24. let origin_pos = getpos('.')
  25. if a:0 > 0
  26. let source_pos = a:1
  27. else
  28. let source_pos = line('.')
  29. endif
  30. call cursor(source_pos, 1)
  31. if markdown#codeblocks#InsideCodeblock(source_pos) == 1
  32. let l:lang = matchstr(getline('.'), '\([~`]\{3}\s\+\)\@<=[[:alpha:]]*')
  33. if l:lang ==# ''
  34. let start_delim = search('^[~`]\{3}', 'nbW')
  35. let l:lang = matchstr(getline(start_delim), '\([~`]\{3}\s\+\)\@<=[[:alpha:]]*')
  36. endif
  37. endif
  38. call cursor(origin_pos[1], origin_pos[2])
  39. return l:lang
  40. endfunction
  41. function! markdown#codeblocks#BodyRange(...) abort
  42. let l:range = []
  43. let origin_pos = getpos('.')
  44. if a:0 > 0
  45. let source_pos = a:1
  46. else
  47. let source_pos = line('.')
  48. endif
  49. call cursor(source_pos, 1)
  50. if markdown#codeblocks#InsideCodeblock(source_pos) == 1
  51. let start_delim = searchpair('^[~`]\{3}', '', '^[~`]\{3}', 'cnbW')
  52. let end_delim = search('^[~`]\{3}', 'cnW')
  53. if start_delim != line('.')
  54. let l:range = [start_delim+1, end_delim-1]
  55. else
  56. " we are at the starting delimiter
  57. if markdown#codeblocks#InsideCodeblock(source_pos-1) == 0
  58. let l:range = [start_delim + 1, search('^[~`]\{3}', 'nW') -1]
  59. " we are at the ending delimiter
  60. else
  61. let l:range = [search('^[~`]\{3}', 'bnW') + 1, end_delim - 1]
  62. endif
  63. endif
  64. endif
  65. call cursor(origin_pos[1], origin_pos[2])
  66. return l:range
  67. endfunction