tex.vim 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. " vim: set fdm=marker et ts=4 sw=4 sts=4:
  2. function! markdown#tex#InsideTeXBlock(...) 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') =~? '^tex'
  11. call cursor(origin_pos[1], origin_pos[2])
  12. return 1
  13. endif
  14. call cursor(source_pos, 1)
  15. let prev_delim = searchpair('^$\{2}', '', '^$\{2}', 'bnW')
  16. let next_delim = search('^$\{2}', 'nW')
  17. call cursor(origin_pos[1], origin_pos[2])
  18. if prev_delim > 0
  19. if source_pos > prev_delim && source_pos < next_delim
  20. return 1
  21. endif
  22. endif
  23. endfunction
  24. function! markdown#tex#BodyRange(...) abort
  25. let l:range = []
  26. let origin_pos = getpos('.')
  27. if a:0 > 0
  28. let source_pos = a:1
  29. else
  30. let source_pos = line('.')
  31. endif
  32. call cursor(source_pos, 1)
  33. if markdown#tex#InsideTeXBlock(source_pos) == 1
  34. let start_delim = searchpair('^$\{2}', '', '^$\{2}', 'cnbW')
  35. let end_delim = search('^$\{2}', 'cnW')
  36. if start_delim != line('.')
  37. let l:range = [start_delim+1, end_delim-1]
  38. else
  39. " we are at the starting delimiter
  40. if markdown#tex#InsideTeXBlock(source_pos-1) == 0
  41. let l:range = [start_delim + 1, search('^$\{2}', 'nW') -1]
  42. " we are at the ending delimiter
  43. else
  44. let l:range = [search('^$\{2}', 'bnW') + 1, end_delim - 1]
  45. endif
  46. endif
  47. endif
  48. call cursor(origin_pos[1], origin_pos[2])
  49. return l:range
  50. endfunction