Skip to content

Commit ee28f37

Browse files
authored
Merge pull request #9 from YaroSpace/develop
v1.2.4.
2 parents 85f52c6 + 971d8f1 commit ee28f37

8 files changed

Lines changed: 154 additions & 58 deletions

File tree

lua/lua-console/config.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ local default_config = {
77
autosave = true, -- autosave on console hide / close
88
load_on_start = true, -- load saved session on start
99
preserve_context = true, -- preserve results between evaluations
10+
print_one_line_results = true,
1011
},
1112
window = {
1213
relative = 'editor',
@@ -16,7 +17,7 @@ local default_config = {
1617
title = ' Lua console ',
1718
title_pos = 'left',
1819
height = 0.6, -- percentage of main window
19-
zindex = 1,
20+
zindex = 100,
2021
},
2122
mappings = {
2223
toggle = '`',

lua/lua-console/injections.lua

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,36 @@ M.set_highlighting = function()
66
local lang_prefix = config.external_evaluators.lang_prefix
77
local lang_pattern = ('^%s([^\\n]-)\\n.+$'):format(lang_prefix)
88

9-
vim.treesitter.query.add_directive('deindent!', function(_, _, _, predicate, metadata) -- remove indentaion in the region
10-
local capture_id = predicate[2]
11-
if not metadata[capture_id].range then return end
9+
vim.treesitter.query.add_directive(
10+
'deindent!',
11+
function(_, _, _, predicate, metadata) -- remove indentaion in the region
12+
local capture_id = predicate[2]
13+
if not metadata[capture_id].range then return end
1214

13-
metadata[capture_id].range[2] = tonumber(predicate[3]) -- set indent col to 0
14-
end, { all = true, force = true })
15+
metadata[capture_id].range[2] = tonumber(predicate[3]) -- set indent col to 0
16+
end,
17+
{ all = true, force = true }
18+
)
1519

1620
local function extend_query(query)
1721
local extended = ''
1822
vim.tbl_map(function(path)
19-
extended = extended .. io.open(path):read("*a") .. '\n'
23+
extended = extended .. io.open(path):read('*a') .. '\n'
2024
end, vim.treesitter.query.get_files('lua', 'injections'))
2125

2226
return extended .. query
2327
end
2428

25-
local query = ([[ ;query
29+
local query_string = ([[ ;query
2630
((string_content) @injection.language @injection.content
27-
(#lua-match? @injection.language "^@1")
28-
(#gsub! @injection.language "@2" "%1")
29-
(#offset! @injection.content 1 0 0 0)
30-
(#deindent! @injection.content 0))
31+
(#lua-match? @injection.language "^@1")
32+
(#gsub! @injection.language "@2" "%1")
33+
(#offset! @injection.content 1 0 0 0)
34+
(#deindent! @injection.content 0))
3135
]]):gsub('@1', lang_prefix):gsub('@2', lang_pattern)
3236

33-
query = extend_query(query)
34-
vim.treesitter.query.set('lua', 'injections', query)
37+
query_string = extend_query(query_string)
38+
vim.treesitter.query.set('lua', 'injections', query_string)
3539
end
3640

3741
return M

lua/lua-console/mappings.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ M.set_evaluator_mappings = function(buf, toggle)
129129
callback = function()
130130
utils.eval_code_in_buffer(buf)
131131
end,
132-
}, { 'n', 'v' })
132+
}, { 'n', 'x' })
133133

134134
set_map(buf, m.eval_buffer, {
135135
desc = 'Eval code in current buffer',

lua/lua-console/utils.lua

Lines changed: 74 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ end
2626
local to_table = function(obj)
2727
obj = type(obj) == 'string' and { obj } or obj
2828

29-
return vim.iter(obj):map(function(line)
30-
return vim.split(line or '', '\n', { trimempty = true })
31-
end):flatten():totable()
29+
return vim
30+
.iter(obj)
31+
:map(function(line)
32+
return vim.split(line or '', '\n', { trimempty = true })
33+
end)
34+
:flatten()
35+
:totable()
3236
end
3337

3438
local function remove_indentation(tbl)
@@ -47,8 +51,8 @@ end
4751
---@param highlight string higlight group
4852
local show_virtual_text = function(buf, id, text, lnum, position, highlight)
4953
local ns = vim.api.nvim_create_namespace('Lua-console')
50-
local ext_mark = vim.api.nvim_buf_get_extmark_by_id(0, ns, id, {})
5154

55+
local ext_mark = vim.api.nvim_buf_get_extmark_by_id(0, ns, id, {})
5256
if #ext_mark > 0 then vim.api.nvim_buf_del_extmark(0, ns, id) end
5357

5458
vim.api.nvim_buf_set_extmark(buf, ns, lnum, 0, {
@@ -77,8 +81,18 @@ local toggle_help = function(buf)
7781

7882
message =
7983
[[%s - eval a line or selection, %s - eval buffer, %s - open file, %s - load messages, %s - save console, %s - load console, %s/%s - resize window, %s - toggle help]]
80-
message =
81-
string.format(message, cm.eval, cm.eval_buffer, cm.open, cm.messages, cm.save, cm.load, cm.resize_up, cm.resize_down, cm.help)
84+
message = string.format(
85+
message,
86+
cm.eval,
87+
cm.eval_buffer,
88+
cm.open,
89+
cm.messages,
90+
cm.save,
91+
cm.load,
92+
cm.resize_up,
93+
cm.resize_down,
94+
cm.help
95+
)
8296

8397
local visible_line = vim.fn.line('w0')
8498
show_virtual_text(buf, 2, message, visible_line - 1, 'overlay', 'Comment')
@@ -155,11 +169,13 @@ local get_last_assignment = function()
155169
for i = lnum - 1, 0, -1 do
156170
line = vim.api.nvim_buf_get_lines(0, i, i + 1, false)[1]
157171

158-
if line:match('^%s*' .. last_var .. '%s*=') then break end
172+
if line:match('^%s*' .. last_var .. '%s*,?[^=]-=') then break end
159173
offset = offset + 1
160174
end
161175

162-
return last_var, last_val, offset
176+
lnum = (lnum - offset) > 0 and lnum - offset or nil
177+
178+
return last_var, last_val, lnum
163179
end
164180

165181
---Pretty prints objects
@@ -191,31 +207,45 @@ end
191207

192208
---@param buf number
193209
---@param lines string[] Text to append to current buffer after current selection
194-
local append_current_buffer = function(buf, lines)
210+
---@param lnum? number|nil Line number to append from
211+
local append_current_buffer = function(buf, lines, lnum)
195212
if not lines or #lines == 0 then return end
213+
lnum = lnum or vim.fn.line('.')
214+
215+
local ns = vim.api.nvim_create_namespace('Lua-console')
216+
vim.api.nvim_buf_clear_namespace(buf, ns, 0, -1)
196217

197-
local lnum = vim.fn.line('.')
198218
local prefix = config.buffer.result_prefix
199219
local empty_results = { 'nil', '', '""', "''" }
200220

201221
local virtual_text
202222
local line = lines[#lines]
203223

204-
local last_assigned_var, last_assigned_val, last_assignment_offset = get_last_assignment()
205-
if last_assigned_var then
206-
virtual_text = to_string(pretty_print(last_assigned_val), '', true)
207-
show_virtual_text(buf, 3, prefix .. virtual_text, lnum - last_assignment_offset - 1, 'eol', 'Comment')
224+
local _, last_assigned_val, last_assignment_lnum = get_last_assignment()
225+
if last_assignment_lnum then
226+
last_assigned_val = to_string(pretty_print(last_assigned_val), '', true)
227+
show_virtual_text(buf, 3, prefix .. last_assigned_val, last_assignment_lnum - 1, 'eol', 'Comment')
208228
end
209229

210230
if vim.tbl_contains(empty_results, line) then
211231
table.remove(lines)
212232

213-
virtual_text = get_line_assignment(vim.fn.getbufline(buf, lnum, lnum)) or line
214-
show_virtual_text(buf, 4, prefix .. virtual_text, lnum - 1, 'eol', 'Comment')
233+
virtual_text = get_line_assignment(vim.fn.getbufline(buf, lnum, lnum)) or line -- ! resets env._last_assignment by calling evaluator
234+
235+
if last_assignment_lnum ~= lnum then
236+
show_virtual_text(buf, 4, prefix .. virtual_text, lnum - 1, 'eol', 'Comment')
237+
end
215238
end
216239

217240
if #lines == 0 then return end
218241

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+
219249
lines[1] = prefix .. lines[1]
220250
table.insert(lines, 1, '') -- insert an empty line
221251

@@ -293,7 +323,7 @@ function get_ctx(buf)
293323
end,
294324
_reset_last_assignment = function()
295325
mt._last_assignment = nil
296-
end
326+
end,
297327
}
298328

299329
lc.ctx[buf] = env
@@ -314,7 +344,7 @@ function lua_evaluator(lines, ctx)
314344
local lines_with_return_last_line = add_return(lines, #lines)
315345

316346
if not select(2, load(to_string(lines_with_return_first_line), '', 't', env)) then
317-
lines = lines_with_return_first_line
347+
lines = lines_with_return_first_line
318348
elseif not select(2, load(to_string(lines_with_return_last_line), '', 't', env)) then
319349
lines = lines_with_return_last_line
320350
end
@@ -408,23 +438,23 @@ end
408438
---@param buf number
409439
---@param range number[]
410440
---@return string
411-
local function get_lang(buf, range)
412-
local pattern = ('^.*' .. config.external_evaluators.lang_prefix .. '(.-)%s*$')
441+
local function get_lang(buf, lnum)
442+
local pattern = ('^.*' .. config.external_evaluators.lang_prefix .. '(%w+)%s*$')
413443
local line, lang
414444

415-
line = vim.api.nvim_buf_get_lines(buf, math.max(0, range[1] - 2), range[2], false)[1]
416-
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)
417447
if lang then return lang end
418448

419449
line = vim.api.nvim_buf_get_lines(buf, 0, 1, false)[1]
420-
lang = line:match(pattern)
450+
lang = line and line:match(pattern)
421451
if lang then return lang end
422452

423453
return vim.bo[buf].filetype
424454
end
425455

426-
local get_evaluator = function(buf, range)
427-
local lang = get_lang(buf, range)
456+
local get_evaluator = function(buf, lnum)
457+
local lang = get_lang(buf, lnum)
428458

429459
if lang == '' then
430460
vim.notify('Plese specify the language to evaluate or set the filetype', vim.log.levels.WARN)
@@ -440,27 +470,35 @@ end
440470
---@param full? boolean evaluate full buffer
441471
local eval_code_in_buffer = function(buf, full)
442472
buf = buf or vim.fn.bufnr()
443-
local win = vim.fn.bufwinid(buf)
444473

445-
if vim.api.nvim_get_mode().mode == 'V' then vim.api.nvim_input('<Esc>') 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
446478

447-
local v_start, v_end
448479
if full then
449480
v_start, v_end = 1, vim.api.nvim_buf_line_count(buf)
450-
else
451-
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+
452487
if v_start > v_end then
453488
v_start, v_end = v_end, v_start
454489
end
490+
else
491+
v_start = vim.fn.line('.')
492+
v_end = v_start
455493
end
456494

457-
vim.api.nvim_win_set_cursor(win, { v_end, 0 })
495+
vim.fn.cursor(v_end, 0)
458496

459-
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)
460498
lines = remove_empty_lines(lines)
461499
if #lines == 0 then return end
462500

463-
local evaluator = get_evaluator(buf, { v_start, v_end })
501+
local evaluator = get_evaluator(buf, v_start - 1)
464502
if not evaluator then return end
465503

466504
local result = evaluator(lines)
@@ -472,6 +510,7 @@ end
472510
---Load messages into console
473511
local load_messages = function(buf)
474512
local ns = vim.api.nvim_create_namespace('Lua-console')
513+
local lnum = vim.fn.line('.')
475514

476515
---This way we catch the output of messages command, in case it was overriden by some other plugin, like Noice
477516
vim.ui_attach(ns, { ext_messages = true }, function(event, entries) ---@diagnostic disable-line
@@ -484,8 +523,8 @@ local load_messages = function(buf)
484523
if #messages == 0 then return end
485524

486525
vim.schedule(function()
487-
vim.api.nvim_input('<Down>') -- forcing to redraw buffer
488-
append_current_buffer(buf, to_table(messages))
526+
append_current_buffer(buf, to_table(messages), lnum)
527+
vim.api.nvim__redraw { flush = true, buf = buf }
489528
end)
490529
end)
491530

spec/log.lua

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,26 @@ local inspect = require('inspect')
33

44
local log = function(...) --luacheck: ignore
55
local caller = debug.getinfo(2)
6+
local caller_path = caller.short_src
67

78
local time = os.date('*t', os.time())
89
time.min, time.sec = 0, 0
10+
11+
---@diagnostic disable-next-line
912
time = os.time() - os.time(time)
1013

14+
if caller_path then
15+
local path_dirs = vim.split(vim.fs.dirname(caller_path), '/')
16+
caller_path = path_dirs[#path_dirs] .. '/' .. vim.fs.basename(caller_path)
17+
end
18+
1119
local result = ('\nLOG #%s (%s:%s:%s) => '):format(
1220
time,
21+
caller_path or '',
1322
caller.name or '',
14-
caller.short_src or '',
1523
caller.currentline or ''
1624
)
25+
1726
local nargs = select('#', ...)
1827
local var_no = ''
1928

spec/spec_helper.lua

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ end
1919
M.to_string = function(tbl)
2020
tbl = tbl or {}
2121

22-
if type(tbl) == 'string' then tbl = { tbl } end
22+
if type(tbl) ~= 'table' then tbl = { tbl } end
2323
return table.concat(tbl, '\n'):clean()
2424
end
2525

@@ -61,17 +61,18 @@ M.send_keys = function(keys)
6161
end
6262

6363
M.get_virtual_text = function(buf, line_start, line_end)
64-
local ns = vim.api.nvim_create_namespace('Lua-console')
65-
local ids = vim.api.nvim_buf_get_extmarks(buf, ns, { line_start or 0, 0 }, { line_end or 0, -1 }, {})
64+
local ids = vim.api.nvim_buf_get_extmarks(buf, -1, { line_start or 0, 0 }, { line_end or -1, -1 }, { details = true })
6665

6766
if vim.tbl_isempty(ids) then
6867
_G.LOG('No extmarks found')
6968
return ''
7069
end
7170

72-
local mark = vim.api.nvim_buf_get_extmark_by_id(buf, ns, ids[1][1], { details = true })
71+
local marks = vim.tbl_map(function(mark)
72+
return mark[4].virt_text[1][1]
73+
end, ids)
7374

74-
return mark[3].virt_text[1][1]
75+
return marks
7576
end
7677

7778
---Collects paths for nested keys

spec/unit/mappings_spec.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ describe('lua-console.nvim - mappings', function()
2929
buffer = {
3030
load_on_start = false,
3131
save_path = vim.fn.stdpath('state') .. '/lua-console-test.lua',
32+
show_one_line_results = true,
3233
},
3334
}
3435

@@ -264,6 +265,7 @@ describe('lua-console.nvim - mappings', function()
264265
utils.attach_toggle(other_buf)
265266
end)
266267

268+
--TODO: finish spec
267269
it('cretes mappings for attached buffer', function()
268270
-- code
269271
end)
@@ -328,6 +330,7 @@ describe('lua-console.nvim - mappings', function()
328330
-- code
329331
end)
330332

333+
--TODO: finish spec
331334
it('removes mappings for dettached buffer', function()
332335
-- code
333336
end)

0 commit comments

Comments
 (0)