Compare commits

...

7 Commits

Author SHA1 Message Date
dundargoc
0b7f87a2a9
Merge 551cb8712f into 7121983c45 2024-12-18 14:40:43 +00:00
Lewis Russell
7121983c45 refactor(man.lua): various changes
- Replace all uses of vim.regex with simpler Lua patterns.
- Replace all uses of vim.fn.substitute with string.gsub.
- Rework error handling so expected errors are passed back via a return.
  - These get routed up an passed to `vim.notify()`
  - Any other errors will cause a stack trace.
- Reworked the module initialization of `localfile_arg`
- Updated all type annotations.
- Refactored CLI completion by introduction a parse_cmdline()
  function.
- Simplified `show_toc()`
- Refactor highlighting
- Inline some functions
- Fix completion on MacOS 13 and earlier.
  - Prefer `manpath -q` over `man -w`
- Make completion more efficient by avoiding vim.fn.sort and vim.fn.uniq
  - Reimplement using a single loop
2024-12-18 14:40:36 +00:00
phanium
888a803755
fix(lsp): vim.lsp.start fails if existing client has no workspace_folders #31608
Problem:
regression since https://github.com/neovim/neovim/pull/31340

`nvim -l repro.lua`:
```lua
vim.lsp.start { cmd = { 'lua-language-server' }, name = 'lua_ls' }
vim.lsp.start { cmd = { 'lua-language-server' }, name = 'lua_ls', root_dir = 'foo' }

-- swapped case will be ok:
-- vim.lsp.start { cmd = { 'lua-language-server' }, name = 'lua_ls', root_dir = 'foo' }
-- vim.lsp.start { cmd = { 'lua-language-server' }, name = 'lua_ls' }
```

Failure:
```
E5113: Error while calling lua chunk: /…/lua/vim/lsp.lua:214: bad argument #1 to
'ipairs' (table expected, got nil)
stack traceback:
        [C]: in function 'ipairs'
        /…/lua/vim/lsp.lua:214: in function 'reuse_client'
        /…/lua/vim/lsp.lua:629: in function 'start'
        repro.lua:34: in main chunk
```
2024-12-18 06:37:12 -08:00
Peter Lithammer
07d5dc8938
feat(lsp): show server version in :checkhealth #31611
Problem:
Language server version information missing from `:checkhealth vim.lsp`.

Solution:
Store `InitializeResult.serverInfo.version` from the `initialize`
response and display for each client in `:checkhealth vim.lsp`.
2024-12-18 06:31:25 -08:00
Justin M. Keyes
f9eb68f340
fix(coverity): error handling CHECKED_RETURN #31618
CID 516406:  Error handling issues  (CHECKED_RETURN)
    /src/nvim/api/vimscript.c: 284 in nvim_call_dict_function()
    278       Object rv = OBJECT_INIT;
    279
    280       typval_T rettv;
    281       bool mustfree = false;
    282       switch (dict.type) {
    283       case kObjectTypeString:
    >>>     CID 516406:  Error handling issues  (CHECKED_RETURN)
    >>>     Calling "eval0" without checking return value (as is done elsewhere 10 out of 12 times).
    284         TRY_WRAP(err, {
    285           eval0(dict.data.string.data, &rettv, NULL, &EVALARG_EVALUATE);
    286           clear_evalarg(&EVALARG_EVALUATE, NULL);
    287         });
    288         if (ERROR_SET(err)) {
    289           return rv;
2024-12-18 06:05:37 -08:00
zeertzjq
738320188f
test(old): fix incorrect comment in test_preview.vim (#31619) 2024-12-18 10:21:52 +08:00
dundargoc
551cb8712f docs: misc
Co-authored-by: Axel <axelhjq@gmail.com>
Co-authored-by: Colin Kennedy <colinvfx@gmail.com>
Co-authored-by: Juan Giordana <juangiordana@gmail.com>
Co-authored-by: Yochem van Rosmalen <git@yochem.nl>
Co-authored-by: ifish <fishioon@live.com>
2024-12-13 14:21:12 +01:00
21 changed files with 427 additions and 413 deletions

View File

@ -131,7 +131,8 @@ https://github.com/cascent/neovim-cygwin was built on Cygwin 2.9.0. Newer `libuv
1. From the MSYS2 shell, install these packages: 1. From the MSYS2 shell, install these packages:
``` ```
pacman -S \ pacman -S \
mingw-w64-ucrt-x86_64-{gcc,cmake,make,ninja,diffutils} mingw-w64-ucrt-x86_64-gcc \
mingw-w64-x86_64-{cmake,make,ninja,diffutils}
``` ```
2. From the Windows Command Prompt (`cmd.exe`), set up the `PATH` and build. 2. From the Windows Command Prompt (`cmd.exe`), set up the `PATH` and build.
@ -292,13 +293,13 @@ Platform-specific requirements are listed below.
### Ubuntu / Debian ### Ubuntu / Debian
```sh ```sh
sudo apt-get install ninja-build gettext cmake unzip curl build-essential sudo apt-get install ninja-build gettext cmake curl build-essential
``` ```
### RHEL / Fedora ### RHEL / Fedora
``` ```
sudo dnf -y install ninja-build cmake gcc make unzip gettext curl glibc-gconv-extra sudo dnf -y install ninja-build cmake gcc make gettext curl glibc-gconv-extra
``` ```
### openSUSE ### openSUSE
@ -310,13 +311,13 @@ sudo zypper install ninja cmake gcc-c++ gettext-tools curl
### Arch Linux ### Arch Linux
``` ```
sudo pacman -S base-devel cmake unzip ninja curl sudo pacman -S base-devel cmake ninja curl
``` ```
### Alpine Linux ### Alpine Linux
``` ```
apk add build-base cmake coreutils curl unzip gettext-tiny-dev apk add build-base cmake coreutils curl gettext-tiny-dev
``` ```
### Void Linux ### Void Linux
@ -380,7 +381,7 @@ or a specific SHA1 like `--override-input neovim-src github:neovim/neovim/89dc8f
### FreeBSD ### FreeBSD
``` ```
sudo pkg install cmake gmake sha unzip wget gettext curl sudo pkg install cmake gmake sha wget gettext curl
``` ```
If you get an error regarding a `sha256sum` mismatch, where the actual SHA-256 hash is `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, then this is your issue (that's the `sha256sum` of an empty file). If you get an error regarding a `sha256sum` mismatch, where the actual SHA-256 hash is `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`, then this is your issue (that's the `sha256sum` of an empty file).
@ -388,7 +389,7 @@ If you get an error regarding a `sha256sum` mismatch, where the actual SHA-256 h
### OpenBSD ### OpenBSD
```sh ```sh
doas pkg_add gmake cmake unzip curl gettext-tools doas pkg_add gmake cmake curl gettext-tools
``` ```
Build can sometimes fail when using the top level `Makefile`, apparently due to some third-party component (see [#2445-comment](https://github.com/neovim/neovim/issues/2445#issuecomment-108124236)). The following instructions use CMake: Build can sometimes fail when using the top level `Makefile`, apparently due to some third-party component (see [#2445-comment](https://github.com/neovim/neovim/issues/2445#issuecomment-108124236)). The following instructions use CMake:

View File

@ -133,6 +133,9 @@ generated-sources benchmark $(FORMAT) $(LINT) $(TEST) doc: | build/.ran-cmake
test: $(TEST) test: $(TEST)
# iwyu-fix-includes can be downloaded from
# https://github.com/include-what-you-use/include-what-you-use/blob/master/fix_includes.py.
# Create a iwyu-fix-includes shell script in your $PATH that invokes the python script.
iwyu: build/.ran-cmake iwyu: build/.ran-cmake
$(CMAKE) --preset iwyu $(CMAKE) --preset iwyu
$(CMAKE) --build build > build/iwyu.log $(CMAKE) --build build > build/iwyu.log

View File

@ -32,7 +32,7 @@ Follow these steps to get LSP features:
Example: >lua Example: >lua
vim.lsp.config['luals'] = { vim.lsp.config['luals'] = {
-- Command and arguments to start the server. -- Command and arguments to start the server.
cmd = { 'lua-language-server' } cmd = { 'lua-language-server' },
-- Filetypes to automatically attach to. -- Filetypes to automatically attach to.
filetypes = { 'lua' }, filetypes = { 'lua' },
@ -97,7 +97,7 @@ Given: >lua
multilineTokenSupport = true, multilineTokenSupport = true,
} }
} }
} },
root_markers = { '.git' }, root_markers = { '.git' },
}) })
@ -885,7 +885,7 @@ foldexpr({lnum}) *vim.lsp.foldexpr()*
To use, check for the "textDocument/foldingRange" capability in an To use, check for the "textDocument/foldingRange" capability in an
|LspAttach| autocommand. Example: >lua |LspAttach| autocommand. Example: >lua
vim.api.nvim_create_autocommand('LspAttach', { vim.api.nvim_create_autocmd('LspAttach', {
callback = function(args) callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id) local client = vim.lsp.get_client_by_id(args.data.client_id)
if client:supports_method('textDocument/foldingRange') then if client:supports_method('textDocument/foldingRange') then
@ -1126,6 +1126,9 @@ Lua module: vim.lsp.client *lsp-client*
• {server_capabilities} (`lsp.ServerCapabilities?`) Response from the • {server_capabilities} (`lsp.ServerCapabilities?`) Response from the
server sent on `initialize` describing the server sent on `initialize` describing the
server's capabilities. server's capabilities.
• {server_info} (`lsp.ServerInfo?`) Response from the server
sent on `initialize` describing information
about the server.
• {progress} (`vim.lsp.Client.Progress`) A ring buffer • {progress} (`vim.lsp.Client.Progress`) A ring buffer
(|vim.ringbuf()|) containing progress messages (|vim.ringbuf()|) containing progress messages
sent by the server. See sent by the server. See

View File

@ -115,6 +115,7 @@ LSP
• |vim.lsp.util.make_position_params()|, |vim.lsp.util.make_range_params()| • |vim.lsp.util.make_position_params()|, |vim.lsp.util.make_range_params()|
and |vim.lsp.util.make_given_range_params()| now require the `position_encoding` and |vim.lsp.util.make_given_range_params()| now require the `position_encoding`
parameter. parameter.
• `:checkhealth vim.lsp` displays the server version (if available).
LUA LUA

View File

@ -1560,8 +1560,8 @@ A jump table for the options with a short description can be found at |Q_op|.
"menu" or "menuone". No effect if "longest" is present. "menu" or "menuone". No effect if "longest" is present.
noselect Same as "noinsert", except that no menu item is noselect Same as "noinsert", except that no menu item is
pre-selected. If both "noinsert" and "noselect" are present, pre-selected. If both "noinsert" and "noselect" are
"noselect" has precedence. present, "noselect" has precedence.
fuzzy Enable |fuzzy-matching| for completion candidates. This fuzzy Enable |fuzzy-matching| for completion candidates. This
allows for more flexible and intuitive matching, where allows for more flexible and intuitive matching, where

View File

@ -70,7 +70,7 @@ adds arbitrary metadata and conditional data to a match.
Queries are written in a lisp-like language documented in Queries are written in a lisp-like language documented in
https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax
Note: The predicates listed there page differ from those Nvim supports. See Note: The predicates listed there differ from those Nvim supports. See
|treesitter-predicates| for a complete list of predicates supported by Nvim. |treesitter-predicates| for a complete list of predicates supported by Nvim.
Nvim looks for queries as `*.scm` files in a `queries` directory under Nvim looks for queries as `*.scm` files in a `queries` directory under

File diff suppressed because it is too large Load Diff

View File

@ -1087,8 +1087,8 @@ vim.go.cia = vim.go.completeitemalign
--- "menu" or "menuone". No effect if "longest" is present. --- "menu" or "menuone". No effect if "longest" is present.
--- ---
--- noselect Same as "noinsert", except that no menu item is --- noselect Same as "noinsert", except that no menu item is
--- pre-selected. If both "noinsert" and "noselect" are present, --- pre-selected. If both "noinsert" and "noselect" are
--- "noselect" has precedence. --- present, "noselect" has precedence.
--- ---
--- fuzzy Enable `fuzzy-matching` for completion candidates. This --- fuzzy Enable `fuzzy-matching` for completion candidates. This
--- allows for more flexible and intuitive matching, where --- allows for more flexible and intuitive matching, where

View File

@ -211,7 +211,7 @@ local function reuse_client_default(client, config)
for _, config_folder in ipairs(config_folders) do for _, config_folder in ipairs(config_folders) do
local found = false local found = false
for _, client_folder in ipairs(client.workspace_folders) do for _, client_folder in ipairs(client.workspace_folders or {}) do
if config_folder.uri == client_folder.uri then if config_folder.uri == client_folder.uri then
found = true found = true
break break
@ -1379,7 +1379,7 @@ end
--- |LspAttach| autocommand. Example: --- |LspAttach| autocommand. Example:
--- ---
--- ```lua --- ```lua
--- vim.api.nvim_create_autocommand('LspAttach', { --- vim.api.nvim_create_autocmd('LspAttach', {
--- callback = function(args) --- callback = function(args)
--- local client = vim.lsp.get_client_by_id(args.data.client_id) --- local client = vim.lsp.get_client_by_id(args.data.client_id)
--- if client:supports_method('textDocument/foldingRange') then --- if client:supports_method('textDocument/foldingRange') then

View File

@ -174,6 +174,10 @@ local validate = vim.validate
--- capabilities. --- capabilities.
--- @field server_capabilities lsp.ServerCapabilities? --- @field server_capabilities lsp.ServerCapabilities?
--- ---
--- Response from the server sent on `initialize` describing information about
--- the server.
--- @field server_info lsp.ServerInfo?
---
--- A ring buffer (|vim.ringbuf()|) containing progress messages --- A ring buffer (|vim.ringbuf()|) containing progress messages
--- sent by the server. --- sent by the server.
--- @field progress vim.lsp.Client.Progress --- @field progress vim.lsp.Client.Progress
@ -556,6 +560,8 @@ function Client:initialize()
self.offset_encoding = self.server_capabilities.positionEncoding self.offset_encoding = self.server_capabilities.positionEncoding
end end
self.server_info = result.serverInfo
if next(self.settings) then if next(self.settings) then
self:notify(ms.workspace_didChangeConfiguration, { settings = self.settings }) self:notify(ms.workspace_didChangeConfiguration, { settings = self.settings })
end end

View File

@ -208,7 +208,7 @@ end
--- @param uri string --- @param uri string
--- @param client_id? integer --- @param client_id? integer
--- @param diagnostics vim.Diagnostic[] --- @param diagnostics lsp.Diagnostic[]
--- @param is_pull boolean --- @param is_pull boolean
local function handle_diagnostics(uri, client_id, diagnostics, is_pull) local function handle_diagnostics(uri, client_id, diagnostics, is_pull)
local fname = vim.uri_to_fname(uri) local fname = vim.uri_to_fname(uri)

View File

@ -40,6 +40,8 @@ local function check_active_clients()
local clients = vim.lsp.get_clients() local clients = vim.lsp.get_clients()
if next(clients) then if next(clients) then
for _, client in pairs(clients) do for _, client in pairs(clients) do
local server_version = vim.tbl_get(client, 'server_info', 'version')
or '? (no serverInfo.version response)'
local cmd ---@type string local cmd ---@type string
local ccmd = client.config.cmd local ccmd = client.config.cmd
if type(ccmd) == 'table' then if type(ccmd) == 'table' then
@ -62,6 +64,7 @@ local function check_active_clients()
end end
report_info(table.concat({ report_info(table.concat({
string.format('%s (id: %d)', client.name, client.id), string.format('%s (id: %d)', client.name, client.id),
string.format('- Version: %s', server_version),
dirs_info, dirs_info,
string.format('- Command: %s', cmd), string.format('- Command: %s', cmd),
string.format('- Settings: %s', vim.inspect(client.settings, { newline = '\n ' })), string.format('- Settings: %s', vim.inspect(client.settings, { newline = '\n ' })),

View File

@ -8,9 +8,9 @@ vim.api.nvim_create_user_command('Man', function(params)
if params.bang then if params.bang then
man.init_pager() man.init_pager()
else else
local ok, err = pcall(man.open_page, params.count, params.smods, params.fargs) local err = man.open_page(params.count, params.smods, params.fargs)
if not ok then if err then
vim.notify(man.errormsg or err, vim.log.levels.ERROR) vim.notify('man.lua: ' .. err, vim.log.levels.ERROR)
end end
end end
end, { end, {
@ -31,6 +31,9 @@ vim.api.nvim_create_autocmd('BufReadCmd', {
pattern = 'man://*', pattern = 'man://*',
nested = true, nested = true,
callback = function(params) callback = function(params)
require('man').read_page(vim.fn.matchstr(params.match, 'man://\\zs.*')) local err = require('man').read_page(assert(params.match:match('man://(.*)')))
if err then
vim.notify('man.lua: ' .. err, vim.log.levels.ERROR)
end
end, end,
}) })

View File

@ -229,10 +229,9 @@ static Object _call_function(String fn, Array args, dict_T *self, Arena *arena,
funcexe.fe_selfdict = self; funcexe.fe_selfdict = self;
TRY_WRAP(err, { TRY_WRAP(err, {
// call_func() retval is deceptive, ignore it. Instead we set `msg_list` // call_func() retval is deceptive, ignore it. Instead TRY_WRAP sets `msg_list` to capture
// (see above) to capture abort-causing non-exception errors. // abort-causing non-exception errors.
call_func(fn.data, (int)fn.size, &rettv, (int)args.size, (void)call_func(fn.data, (int)fn.size, &rettv, (int)args.size, vim_args, &funcexe);
vim_args, &funcexe);
}); });
if (!ERROR_SET(err)) { if (!ERROR_SET(err)) {
@ -280,18 +279,23 @@ Object nvim_call_dict_function(Object dict, String fn, Array args, Arena *arena,
typval_T rettv; typval_T rettv;
bool mustfree = false; bool mustfree = false;
switch (dict.type) { switch (dict.type) {
case kObjectTypeString: case kObjectTypeString: {
int eval_ret;
TRY_WRAP(err, { TRY_WRAP(err, {
eval0(dict.data.string.data, &rettv, NULL, &EVALARG_EVALUATE); eval_ret = eval0(dict.data.string.data, &rettv, NULL, &EVALARG_EVALUATE);
clear_evalarg(&EVALARG_EVALUATE, NULL); clear_evalarg(&EVALARG_EVALUATE, NULL);
}); });
if (ERROR_SET(err)) { if (ERROR_SET(err)) {
return rv; return rv;
} }
if (eval_ret != OK) {
abort(); // Should not happen.
}
// Evaluation of the string arg created a new dict or increased the // Evaluation of the string arg created a new dict or increased the
// refcount of a dict. Not necessary for a RPC dict. // refcount of a dict. Not necessary for a RPC dict.
mustfree = true; mustfree = true;
break; break;
}
case kObjectTypeDict: case kObjectTypeDict:
object_to_vim(dict, &rettv, err); object_to_vim(dict, &rettv, err);
break; break;

View File

@ -1531,8 +1531,8 @@ return {
"menu" or "menuone". No effect if "longest" is present. "menu" or "menuone". No effect if "longest" is present.
noselect Same as "noinsert", except that no menu item is noselect Same as "noinsert", except that no menu item is
pre-selected. If both "noinsert" and "noselect" are present, pre-selected. If both "noinsert" and "noselect" are
"noselect" has precedence. present, "noselect" has precedence.
fuzzy Enable |fuzzy-matching| for completion candidates. This fuzzy Enable |fuzzy-matching| for completion candidates. This
allows for more flexible and intuitive matching, where allows for more flexible and intuitive matching, where

View File

@ -6378,7 +6378,7 @@ void win_drag_vsep_line(win_T *dragwin, int offset)
fr = curfr; // put fr at window that grows fr = curfr; // put fr at window that grows
} }
// If not enough room thn move as far as we can // If not enough room then move as far as we can
offset = MIN(offset, room); offset = MIN(offset, room);
// No room at all, quit. // No room at all, quit.

View File

@ -1854,6 +1854,20 @@ describe('LSP', function()
end, end,
} }
end) end)
it('vim.lsp.start when existing client has no workspace_folders', function()
exec_lua(create_server_definition)
eq(
{ 2, 'foo', 'foo' },
exec_lua(function()
local server = _G._create_server()
vim.lsp.start { cmd = server.cmd, name = 'foo' }
vim.lsp.start { cmd = server.cmd, name = 'foo', root_dir = 'bar' }
local foos = vim.lsp.get_clients()
return { #foos, foos[1].name, foos[2].name }
end)
)
end)
end) end)
describe('parsing tests', function() describe('parsing tests', function()

View File

@ -21,13 +21,12 @@ local function get_search_history(name)
local man = require('man') local man = require('man')
local res = {} local res = {}
--- @diagnostic disable-next-line:duplicate-set-field --- @diagnostic disable-next-line:duplicate-set-field
man.find_path = function(sect, name0) man._find_path = function(name0, sect)
table.insert(res, { sect, name0 }) table.insert(res, { sect, name0 })
return nil return nil
end end
local ok, rv = pcall(man.open_page, -1, { tab = 0 }, args) local err = man.open_page(-1, { tab = 0 }, args)
assert(not ok) assert(err and err:match('no manual entry'))
assert(rv and rv:match('no manual entry'))
return res return res
end) end)
end end
@ -225,7 +224,7 @@ describe(':Man', function()
matches('^/.+', actual_file) matches('^/.+', actual_file)
local args = { nvim_prog, '--headless', '+:Man ' .. actual_file, '+q' } local args = { nvim_prog, '--headless', '+:Man ' .. actual_file, '+q' }
matches( matches(
('Error detected while processing command line:\r\n' .. 'man.lua: "no manual entry for %s"'):format( ('Error detected while processing command line:\r\n' .. 'man.lua: no manual entry for %s'):format(
pesc(actual_file) pesc(actual_file)
), ),
fn.system(args, { '' }) fn.system(args, { '' })
@ -235,8 +234,8 @@ describe(':Man', function()
it('tries variants with spaces, underscores #22503', function() it('tries variants with spaces, underscores #22503', function()
eq({ eq({
{ '', 'NAME WITH SPACES' }, { vim.NIL, 'NAME WITH SPACES' },
{ '', 'NAME_WITH_SPACES' }, { vim.NIL, 'NAME_WITH_SPACES' },
}, get_search_history('NAME WITH SPACES')) }, get_search_history('NAME WITH SPACES'))
eq({ eq({
{ '3', 'some other man' }, { '3', 'some other man' },
@ -255,8 +254,8 @@ describe(':Man', function()
{ 'n', 'some_other_man' }, { 'n', 'some_other_man' },
}, get_search_history('n some other man')) }, get_search_history('n some other man'))
eq({ eq({
{ '', '123some other man' }, { vim.NIL, '123some other man' },
{ '', '123some_other_man' }, { vim.NIL, '123some_other_man' },
}, get_search_history('123some other man')) }, get_search_history('123some other man'))
eq({ eq({
{ '1', 'other_man' }, { '1', 'other_man' },
@ -265,11 +264,10 @@ describe(':Man', function()
end) end)
it('can complete', function() it('can complete', function()
t.skip(t.is_os('mac') and t.is_arch('x86_64'), 'not supported on intel mac')
eq( eq(
true, true,
exec_lua(function() exec_lua(function()
return #require('man').man_complete('f', 'Man g') > 0 return #require('man').man_complete('f', 'Man f') > 0
end) end)
) )
end) end)

View File

@ -59,7 +59,8 @@ func Test_window_preview_terminal()
CheckFeature quickfix CheckFeature quickfix
" CheckFeature terminal " CheckFeature terminal
term " ++curwin " term ++curwin
term
const buf_num = bufnr('$') const buf_num = bufnr('$')
call assert_equal(1, winnr('$')) call assert_equal(1, winnr('$'))
exe 'pbuffer' . buf_num exe 'pbuffer' . buf_num

View File

@ -58,11 +58,11 @@ describe('mbyte', function()
lib.schar_get(buf, lib.utfc_ptr2schar(to_string(seq), firstc)) lib.schar_get(buf, lib.utfc_ptr2schar(to_string(seq), firstc))
local str = ffi.string(buf) local str = ffi.string(buf)
if 1 > 2 then -- for debugging if 1 > 2 then -- for debugging
local tabel = {} local tbl = {}
for i = 1, #str do for i = 1, #str do
table.insert(tabel, string.format('0x%02x', string.byte(str, i))) table.insert(tbl, string.format('0x%02x', string.byte(str, i)))
end end
print('{ ' .. table.concat(tabel, ', ') .. ' }') print('{ ' .. table.concat(tbl, ', ') .. ' }')
io.stdout:flush() io.stdout:flush()
end end
return { str, firstc[0] } return { str, firstc[0] }

View File

@ -1094,7 +1094,7 @@ describe('vterm', function()
push('\x1b[0F', vt) push('\x1b[0F', vt)
cursor(0, 0, state) cursor(0, 0, state)
-- Cursor Horizonal Absolute -- Cursor Horizontal Absolute
push('\n', vt) push('\n', vt)
cursor(1, 0, state) cursor(1, 0, state)
push('\x1b[20G', vt) push('\x1b[20G', vt)
@ -3067,7 +3067,7 @@ describe('vterm', function()
screen screen
) )
-- Outputing CJK doublewidth in 80th column should wraparound to next line and not crash" -- Outputting CJK doublewidth in 80th column should wraparound to next line and not crash"
reset(nil, screen) reset(nil, screen)
push('\x1b[80G\xEF\xBC\x90', vt) push('\x1b[80G\xEF\xBC\x90', vt)
screen_cell(0, 79, '{} width=1 attrs={} fg=rgb(240,240,240) bg=rgb(0,0,0)', screen) screen_cell(0, 79, '{} width=1 attrs={} fg=rgb(240,240,240) bg=rgb(0,0,0)', screen)