@@ -169,7 +169,7 @@ local get_last_assignment = function()
169169 for i = lnum - 1 , 0 , - 1 do
170170 line = vim .api .nvim_buf_get_lines (0 , i , i + 1 , false )[1 ]
171171
172- if line :match (' ^%s*' .. last_var .. ' %s*=' ) then break end
172+ if line :match (' ^%s*' .. last_var .. ' %s*,?[^=]- =' ) then break end
173173 offset = offset + 1
174174 end
175175
@@ -232,11 +232,20 @@ local append_current_buffer = function(buf, lines, lnum)
232232
233233 virtual_text = get_line_assignment (vim .fn .getbufline (buf , lnum , lnum )) or line -- ! resets env._last_assignment by calling evaluator
234234
235- if not last_assignment_lnum then show_virtual_text (buf , 4 , prefix .. virtual_text , lnum - 1 , ' eol' , ' Comment' ) end
235+ if last_assignment_lnum ~= lnum then
236+ show_virtual_text (buf , 4 , prefix .. virtual_text , lnum - 1 , ' eol' , ' Comment' )
237+ end
236238 end
237239
238240 if # lines == 0 then return end
239241
242+ if # lines == 1 and last_assignment_lnum ~= lnum and not config .buffer .show_one_line_results then
243+ virtual_text = lines [1 ]
244+ show_virtual_text (buf , 4 , prefix .. virtual_text , lnum - 1 , ' eol' , ' Comment' )
245+
246+ return
247+ end
248+
240249 lines [1 ] = prefix .. lines [1 ]
241250 table.insert (lines , 1 , ' ' ) -- insert an empty line
242251
@@ -429,23 +438,23 @@ end
429438--- @param buf number
430439--- @param range number[]
431440--- @return string
432- local function get_lang (buf , range )
441+ local function get_lang (buf , lnum )
433442 local pattern = (' ^.*' .. config .external_evaluators .lang_prefix .. ' (%w+)%s*$' )
434443 local line , lang
435444
436- line = vim .api .nvim_buf_get_lines (buf , math.max (0 , range [ 1 ] - 2 ), range [ 2 ] , false )[1 ]
437- lang = line :match (pattern )
445+ line = vim .api .nvim_buf_get_lines (buf , math.max (0 , lnum - 1 ), lnum , false )[1 ]
446+ lang = line and line :match (pattern )
438447 if lang then return lang end
439448
440449 line = vim .api .nvim_buf_get_lines (buf , 0 , 1 , false )[1 ]
441- lang = line :match (pattern )
450+ lang = line and line :match (pattern )
442451 if lang then return lang end
443452
444453 return vim .bo [buf ].filetype
445454end
446455
447- local get_evaluator = function (buf , range )
448- local lang = get_lang (buf , range )
456+ local get_evaluator = function (buf , lnum )
457+ local lang = get_lang (buf , lnum )
449458
450459 if lang == ' ' then
451460 vim .notify (' Plese specify the language to evaluate or set the filetype' , vim .log .levels .WARN )
@@ -461,30 +470,35 @@ end
461470--- @param full ? boolean evaluate full buffer
462471local eval_code_in_buffer = function (buf , full )
463472 buf = buf or vim .fn .bufnr ()
464- local win = vim .fn .bufwinid (buf )
465473
466- if vim .api .nvim_get_mode ().mode == ' V ' then
467- LOG ( ' here ' )
468- vim . api . nvim_input ( ' <Esc> ' )
469- end
474+ local mode = vim .api .nvim_get_mode ().mode
475+ if mode == ' V ' or mode == ' v ' then vim . api . nvim_input ( ' <Esc> ' ) end
476+
477+ local v_start , v_end , lines
470478
471- local v_start , v_end
472479 if full then
473480 v_start , v_end = 1 , vim .api .nvim_buf_line_count (buf )
474- else
475- v_start , v_end = vim .fn .line (' .' , win ), vim .fn .line (' v' , win )
481+ elseif mode == ' v' or mode == ' V' then
482+ v_start , v_end = vim .fn .getpos (' .' ), vim .fn .getpos (' v' )
483+ lines = vim .fn .getregion (v_start , v_end , { type = mode })
484+
485+ v_start , v_end = v_start [2 ], v_end [2 ]
486+
476487 if v_start > v_end then
477488 v_start , v_end = v_end , v_start
478489 end
490+ else
491+ v_start = vim .fn .line (' .' )
492+ v_end = v_start
479493 end
480494
481- vim .api . nvim_win_set_cursor ( win , { v_end , 0 } )
495+ vim .fn . cursor ( v_end , 0 )
482496
483- local lines = vim .api .nvim_buf_get_lines (buf , v_start - 1 , v_end , false )
497+ lines = lines or vim .api .nvim_buf_get_lines (buf , v_start - 1 , v_end , false )
484498 lines = remove_empty_lines (lines )
485499 if # lines == 0 then return end
486500
487- local evaluator = get_evaluator (buf , { v_start , v_end } )
501+ local evaluator = get_evaluator (buf , v_start - 1 )
488502 if not evaluator then return end
489503
490504 local result = evaluator (lines )
0 commit comments