@@ -2,7 +2,6 @@ vim9script
22
33import autoload " ./constants.vim"
44
5-
65export def Echoerr (msg: string )
76 echohl ErrorMsg | echom $ ' [markdown_extras] {msg}' | echohl None
87enddef
@@ -11,7 +10,6 @@ export def Echowarn(msg: string)
1110 echohl WarningMsg | echom $ ' [markdown_extras] {msg}' | echohl None
1211enddef
1312
14-
1513export def FormatWithoutMoving (a: number = 0 , b: number = 0 )
1614 # To be used for formatting through autocmds
1715 var view = winsaveview ()
@@ -238,12 +236,11 @@ export def SurroundSmart(style: string, type: string = '')
238236 if style != ' markdownCode'
239237 A_to_B = A_to_B- >substitute ($ ' \V{join(delimiters_to_remove, ' \| ' )}' , ' ' , ' g' )
240238 endif
241- # echom " A_to_B: " .. A_to_B
242239
243- echom $ ' toA: ' .. toA
244- echom $ ' fromB: ' .. fromB
245- echom $ ' A_to_B:' .. A_to_B
246- echom ' ----------\n'
240+ # echom $ ' toA: ' .. toA
241+ # echom $ ' fromB: ' .. fromB
242+ # echom $ ' A_to_B:' .. A_to_B
243+ # echom ' ----------\n'
247244
248245 # Set the whole line
249246 setline (lA, toA .. A_to_B .. fromB)
@@ -381,7 +378,6 @@ export def IsBetweenMarks(A: string, B: string): bool
381378 return result
382379enddef
383380
384-
385381export def IsInRange (): dict <list<list<number> >>
386382 # Return a dict like {' markdownCode' : [[21 , 19 ], [22 , 21 ]]}.
387383 # The returned intervals are open .
@@ -414,38 +410,69 @@ export def IsInRange(): dict<list<list<number>>>
414410 enddef
415411
416412 # Main function start here
417- const text_style =
418- synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" ) == ' markdownItalic'
419- || synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" ) == ' markdownBold'
413+ # text_style comes from vim - markdown
414+ const text_style = synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
415+ const text_style_adjusted =
416+ text_style == ' markdownItalic' || text_style == ' markdownBold'
420417 ? StarOrUnderscore (synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" ))
421418 : synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
422419 var return_val = {}
423420
424- if ! empty (text_style)
425- && index (keys (constants.TEXT_STYLES_DICT), text_style) != -1
421+ if ! empty (text_style_adjusted)
422+ && index (keys (constants.TEXT_STYLES_DICT), text_style_adjusted) != -1
423+
424+ const saved_curpos = getcursorcharpos ()
426425
427426 # Search start delimiter
428427 const open_delim =
429- eval ($ ' constants.TEXT_STYLES_DICT.{text_style}.open_delim' )
430- const open_regex =
431- eval ($ ' constants.TEXT_STYLES_DICT.{text_style}.open_regex' )
432- var start_delim = searchpos (open_regex, ' nbW' )
433- start_delim[1 ] += len (open_delim)
428+ eval ($ ' constants.TEXT_STYLES_DICT.{text_style_adjusted}.open_delim' )
429+
430+ var open_delim_pos = searchpos ($ ' \V{open_delim}' , ' bW' )
431+ var current_style = synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
432+ while current_style != $ ' {text_style}Delimiter'
433+ open_delim_pos = searchpos ($ ' \V{open_delim}' , ' bW' )
434+ current_style = synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
435+ endwhile
436+ open_delim_pos[1 ] += len (open_delim)
434437
435- # Search end delimiter
438+ # Search end delimiter . The end delimiter may be a blank line , hence
439+ # things become a bit cumbersome.
440+ setcursorcharpos (saved_curpos[1 : 2 ])
436441 const close_delim =
437- eval ($ ' constants.TEXT_STYLES_DICT.{text_style}.close_delim' )
438- const close_regex =
439- eval ($ ' constants.TEXT_STYLES_DICT.{text_style}.close_regex' )
440- var end_delim = searchpos (close_regex, ' ncW' )
441-
442- # TODO : Very ugly hack due to the LINK_CLOSE_REGEX ending up on ]
443- if synIDattr (synID (end_delim[0 ], end_delim[1 ], 1 ), " name" )
444- == ' markdownLinkTextDelimiter'
445- end_delim[1 ] -= 1
442+ eval ($ ' constants.TEXT_STYLES_DICT.{text_style_adjusted}.close_delim' )
443+ var close_delim_pos = searchpos ($ ' \V{close_delim}' , ' nW' )
444+ var blank_line_pos = searchpos ($ ' ^$' , ' nW' )
445+ var first_met = [0 , 0 ]
446+ current_style = synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
447+
448+ while current_style != $ ' {text_style}Delimiter'
449+ && getline (line (' .' )) !~ ' ^$'
450+ close_delim_pos = searchpos ($ ' \V{close_delim}' , ' nW' )
451+ blank_line_pos = searchpos ($ ' ^$' , ' nW' )
452+ if close_delim_pos == [0 , 0 ]
453+ first_met = blank_line_pos
454+ elseif blank_line_pos == [0 , 0 ]
455+ first_met = close_delim_pos
456+ else
457+ first_met = IsLess (close_delim_pos, blank_line_pos)
458+ ? close_delim_pos
459+ : blank_line_pos
460+ endif
461+ setcursorcharpos (first_met)
462+ current_style = synIDattr (synID (line (" ." ), col (" ." ), 1 ), " name" )
463+ endwhile
464+
465+ # If we hit a blank line , then we take the previous line and last column,
466+ # to keep consistency in returning open - intervals
467+ if getline (line (' .' )) = ~ ' ^$'
468+ first_met[0 ] = first_met[0 ] - 1
469+ first_met[1 ] = len (getline (first_met[0 ]))
470+ else
471+ first_met[1 ] -= 1
446472 endif
447473
448- return_val = {[text_style]: [start_delim, end_delim]}
474+ setcursorcharpos (saved_curpos[1 : 2 ])
475+ return_val = {[text_style_adjusted]: [open_delim_pos, first_met]}
449476 endif
450477
451478 return return_val
0 commit comments