sections.vim 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. " vim: set fdm=marker et ts=4 sw=4 sts=4:
  2. "
  3. " functions to handle sections not handled by headers.vim
  4. "
  5. function! markdown#sections#CurrentEndSection(...) abort
  6. if a:0 > 0
  7. return markdown#sections#NextEndSection(1, a:1)
  8. else
  9. return markdown#sections#NextEndSection(1)
  10. endif
  11. endfunction
  12. function! markdown#sections#NextEndSection(stop_at_current, ...) abort
  13. let origin_pos = getpos('.')
  14. if a:0 > 0
  15. let search_from = [0, a:1, 1, 0]
  16. else
  17. let search_from = getpos('.')
  18. endif
  19. call cursor(search_from[1], 2)
  20. let next_sect_start = markdown#headers#NextHeader(search_from[1])
  21. if synIDattr(synID(line('.')+1, 1, 0), 'name') !~#
  22. \'pandoc\(SetexHeader\|AtxStart\)'
  23. let lnum = next_sect_start - 1
  24. else
  25. if a:stop_at_current == 1
  26. let lnum = search_from[1]
  27. else
  28. let lnum = markdown#headers#NextHeader(next_sect_start) - 1
  29. endif
  30. endif
  31. call cursor(origin_pos[1], origin_pos[2])
  32. return lnum
  33. endfunction
  34. function! markdown#sections#PrevEndSection(...) abort
  35. let origin_pos = getpos('.')
  36. if a:0 > 0
  37. let search_from = [0, a:1, 1, 0]
  38. else
  39. let search_from = getpos('.')
  40. endif
  41. call cursor(search_from[1], 2)
  42. if search_from[1] != markdown#headers#CurrentHeader(search_from[1])
  43. let lnum = markdown#headers#PrevHeader(search_from[1]) - 1
  44. else
  45. let lnum = search_from[1] - 1
  46. endif
  47. call cursor(origin_pos[1], origin_pos[2])
  48. return lnum
  49. endfunction
  50. function! markdown#sections#SectionRange(mode, ...) abort
  51. let c_header = markdown#headers#CurrentHeader()
  52. if c_header == 0
  53. let start = 1
  54. else
  55. if a:mode ==# 'inclusive'
  56. let start = c_header
  57. elseif a:mode ==# 'exclusive'
  58. let start = c_header + 1
  59. endif
  60. endif
  61. let n_sibling_header = markdown#headers#NextSiblingHeader()
  62. if n_sibling_header == 0
  63. let n_header = markdown#headers#NextHeader()
  64. if n_header == 0 || n_header == line('.')
  65. let end = line('$')
  66. else
  67. let end = n_header - 1
  68. endif
  69. else
  70. let end = n_sibling_header - 1
  71. endif
  72. return [start, end]
  73. endfunction