mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 19:38:20 +00:00
feat(lua): vim.text.indent()
Problem: Indenting text is a common task in plugins/scripts for presentation/formatting, yet vim has no way of doing it (especially "dedent", and especially non-buffer text). Solution: Introduce `vim.text.indent()`. It sets the *exact* indentation because that's a more difficult (and thus more useful) task than merely "increasing the current indent" (which is somewhat easy with a `gsub()` one-liner).
This commit is contained in:
@@ -4624,6 +4624,41 @@ vim.text.hexencode({str}) *vim.text.hexencode()*
|
|||||||
Return: ~
|
Return: ~
|
||||||
(`string`) Hex encoded string
|
(`string`) Hex encoded string
|
||||||
|
|
||||||
|
vim.text.indent({size}, {text}, {opts}) *vim.text.indent()*
|
||||||
|
Sets the indent (i.e. the common leading whitespace) of non-empty lines in
|
||||||
|
`text` to `size` spaces/tabs.
|
||||||
|
|
||||||
|
Indent is calculated by number of consecutive indent chars.
|
||||||
|
• The first indented, non-empty line decides the indent char (space/tab):
|
||||||
|
• `SPC SPC TAB …` = two-space indent.
|
||||||
|
• `TAB SPC …` = one-tab indent.
|
||||||
|
• Set `opts.expandtab` to treat tabs as spaces.
|
||||||
|
|
||||||
|
To "dedent" (remove the common indent), pass `size=0`: >lua
|
||||||
|
vim.print(vim.text.indent(0, ' a\n b\n'))
|
||||||
|
<
|
||||||
|
|
||||||
|
To adjust relative-to an existing indent, call indent() twice: >lua
|
||||||
|
local indented, old_indent = vim.text.indent(0, ' a\n b\n')
|
||||||
|
indented = vim.text.indent(old_indent + 2, indented)
|
||||||
|
vim.print(indented)
|
||||||
|
<
|
||||||
|
|
||||||
|
To ignore the final, blank line when calculating the indent, use gsub()
|
||||||
|
before calling indent(): >lua
|
||||||
|
local text = ' a\n b\n '
|
||||||
|
vim.print(vim.text.indent(0, (text:gsub('\n[\t ]+\n?$', '\n'))))
|
||||||
|
<
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {size} (`integer`) Number of spaces.
|
||||||
|
• {text} (`string`) Text to indent.
|
||||||
|
• {opts} (`{ expandtab?: number }?`)
|
||||||
|
|
||||||
|
Return (multiple): ~
|
||||||
|
(`string`) Indented text.
|
||||||
|
(`integer`) Indent size before modification.
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Lua module: tohtml *vim.tohtml*
|
Lua module: tohtml *vim.tohtml*
|
||||||
|
@@ -321,6 +321,7 @@ LUA
|
|||||||
• |vim.fs.relpath()| gets relative path compared to base path.
|
• |vim.fs.relpath()| gets relative path compared to base path.
|
||||||
• |vim.fs.dir()| and |vim.fs.find()| now follow symbolic links by default,
|
• |vim.fs.dir()| and |vim.fs.find()| now follow symbolic links by default,
|
||||||
the behavior can be turn off using the new `follow` option.
|
the behavior can be turn off using the new `follow` option.
|
||||||
|
• |vim.text.indent()| indents/dedents text.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
|
|
||||||
|
@@ -186,18 +186,13 @@ local function get_healthcheck(plugin_names)
|
|||||||
return healthchecks
|
return healthchecks
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Indents lines *except* line 1 of a string if it contains newlines.
|
--- Indents lines *except* line 1 of a multiline string.
|
||||||
---
|
---
|
||||||
--- @param s string
|
--- @param s string
|
||||||
--- @param columns integer
|
--- @param columns integer
|
||||||
--- @return string
|
--- @return string
|
||||||
local function indent_after_line1(s, columns)
|
local function indent_after_line1(s, columns)
|
||||||
local lines = vim.split(s, '\n')
|
return (vim.text.indent(columns, s):gsub('^%s+', ''))
|
||||||
local indent = string.rep(' ', columns)
|
|
||||||
for i = 2, #lines do
|
|
||||||
lines[i] = indent .. lines[i]
|
|
||||||
end
|
|
||||||
return table.concat(lines, '\n')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Changes ':h clipboard' to ':help |clipboard|'.
|
--- Changes ':h clipboard' to ':help |clipboard|'.
|
||||||
|
@@ -50,4 +50,91 @@ function M.hexdecode(enc)
|
|||||||
return table.concat(str), nil
|
return table.concat(str), nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Sets the indent (i.e. the common leading whitespace) of non-empty lines in `text` to `size`
|
||||||
|
--- spaces/tabs.
|
||||||
|
---
|
||||||
|
--- Indent is calculated by number of consecutive indent chars.
|
||||||
|
--- - The first indented, non-empty line decides the indent char (space/tab):
|
||||||
|
--- - `SPC SPC TAB …` = two-space indent.
|
||||||
|
--- - `TAB SPC …` = one-tab indent.
|
||||||
|
--- - Set `opts.expandtab` to treat tabs as spaces.
|
||||||
|
---
|
||||||
|
--- To "dedent" (remove the common indent), pass `size=0`:
|
||||||
|
--- ```lua
|
||||||
|
--- vim.print(vim.text.indent(0, ' a\n b\n'))
|
||||||
|
--- ```
|
||||||
|
---
|
||||||
|
--- To adjust relative-to an existing indent, call indent() twice:
|
||||||
|
--- ```lua
|
||||||
|
--- local indented, old_indent = vim.text.indent(0, ' a\n b\n')
|
||||||
|
--- indented = vim.text.indent(old_indent + 2, indented)
|
||||||
|
--- vim.print(indented)
|
||||||
|
--- ```
|
||||||
|
---
|
||||||
|
--- To ignore the final, blank line when calculating the indent, use gsub() before calling indent():
|
||||||
|
--- ```lua
|
||||||
|
--- local text = ' a\n b\n '
|
||||||
|
--- vim.print(vim.text.indent(0, (text:gsub('\n[\t ]+\n?$', '\n'))))
|
||||||
|
--- ```
|
||||||
|
---
|
||||||
|
--- @param size integer Number of spaces.
|
||||||
|
--- @param text string Text to indent.
|
||||||
|
--- @param opts? { expandtab?: number }
|
||||||
|
--- @return string # Indented text.
|
||||||
|
--- @return integer # Indent size _before_ modification.
|
||||||
|
function M.indent(size, text, opts)
|
||||||
|
vim.validate('size', size, 'number')
|
||||||
|
vim.validate('text', text, 'string')
|
||||||
|
vim.validate('opts', opts, 'table', true)
|
||||||
|
-- TODO(justinmk): `opts.prefix`, `predicate` like python https://docs.python.org/3/library/textwrap.html
|
||||||
|
opts = opts or {}
|
||||||
|
local tabspaces = opts.expandtab and (' '):rep(opts.expandtab) or nil
|
||||||
|
|
||||||
|
--- Minimum common indent shared by all lines.
|
||||||
|
local old_indent --[[@type number?]]
|
||||||
|
local prefix = tabspaces and ' ' or nil -- Indent char (space or tab).
|
||||||
|
--- Check all non-empty lines, capturing leading whitespace (if any).
|
||||||
|
--- @diagnostic disable-next-line: no-unknown
|
||||||
|
for line_ws, extra in text:gmatch('([\t ]*)([^\n]+)') do
|
||||||
|
line_ws = tabspaces and line_ws:gsub('[\t]', tabspaces) or line_ws
|
||||||
|
-- XXX: blank line will miss the last whitespace char in `line_ws`, so we need to check `extra`.
|
||||||
|
line_ws = line_ws .. (extra:match('^%s+$') or '')
|
||||||
|
if 0 == #line_ws then
|
||||||
|
-- Optimization: If any non-empty line has indent=0, there is no common indent.
|
||||||
|
old_indent = 0
|
||||||
|
break
|
||||||
|
end
|
||||||
|
prefix = prefix and prefix or line_ws:sub(1, 1)
|
||||||
|
local _, end_ = line_ws:find('^[' .. prefix .. ']+')
|
||||||
|
old_indent = math.min(old_indent or math.huge, end_ or 0)
|
||||||
|
end
|
||||||
|
-- Default to 0 if all lines are empty.
|
||||||
|
old_indent = old_indent or 0
|
||||||
|
prefix = prefix and prefix or ' '
|
||||||
|
|
||||||
|
if old_indent == size then
|
||||||
|
-- Optimization: if the indent is the same, return the text unchanged.
|
||||||
|
return text, old_indent
|
||||||
|
end
|
||||||
|
|
||||||
|
local new_indent = prefix:rep(size)
|
||||||
|
|
||||||
|
--- Replaces indentation of a line.
|
||||||
|
--- @param line string
|
||||||
|
local function replace_line(line)
|
||||||
|
-- Match the existing indent exactly; avoid over-matching any following whitespace.
|
||||||
|
local pat = prefix:rep(old_indent)
|
||||||
|
-- Expand tabs before replacing indentation.
|
||||||
|
line = not tabspaces and line
|
||||||
|
or line:gsub('^[\t ]+', function(s)
|
||||||
|
return s:gsub('\t', tabspaces)
|
||||||
|
end)
|
||||||
|
-- Text following the indent.
|
||||||
|
local line_text = line:match('^' .. pat .. '(.*)') or line
|
||||||
|
return new_indent .. line_text
|
||||||
|
end
|
||||||
|
|
||||||
|
return (text:gsub('[^\n]+', replace_line)), old_indent
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
@@ -766,18 +766,8 @@ local function scope_more_doc(o)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- @param x string
|
--- @param x string
|
||||||
--- @return string
|
|
||||||
local function dedent(x)
|
local function dedent(x)
|
||||||
local xs = split(x)
|
return (vim.text.indent(0, (x:gsub('\n%s-([\n]?)$', '\n%1'))))
|
||||||
local leading_ws = xs[1]:match('^%s*') --[[@as string]]
|
|
||||||
local leading_ws_pat = '^' .. leading_ws
|
|
||||||
|
|
||||||
for i in ipairs(xs) do
|
|
||||||
local strip_pat = xs[i]:match(leading_ws_pat) and leading_ws_pat or '^%s*'
|
|
||||||
xs[i] = xs[i]:gsub(strip_pat, '')
|
|
||||||
end
|
|
||||||
|
|
||||||
return table.concat(xs, '\n')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- @return table<string,vim.option_meta>
|
--- @return table<string,vim.option_meta>
|
||||||
|
@@ -148,10 +148,6 @@ local function url_encode(s)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function expandtabs(s)
|
|
||||||
return s:gsub('\t', (' '):rep(8)) --[[ @as string ]]
|
|
||||||
end
|
|
||||||
|
|
||||||
local function to_titlecase(s)
|
local function to_titlecase(s)
|
||||||
local text = ''
|
local text = ''
|
||||||
for w in vim.gsplit(s, '[ \t]+') do
|
for w in vim.gsplit(s, '[ \t]+') do
|
||||||
@@ -275,25 +271,13 @@ end
|
|||||||
---
|
---
|
||||||
--- Blank lines (empty or whitespace-only) are ignored.
|
--- Blank lines (empty or whitespace-only) are ignored.
|
||||||
local function get_indent(s)
|
local function get_indent(s)
|
||||||
local min_indent = nil
|
local _, indent = vim.text.indent(0, s, { expandtab = 8 })
|
||||||
for line in vim.gsplit(s, '\n') do
|
return indent
|
||||||
if line and not is_blank(line) then
|
|
||||||
local ws = expandtabs(line:match('^%s+') or '')
|
|
||||||
min_indent = (not min_indent or ws:len() < min_indent) and ws:len() or min_indent
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return min_indent or 0
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Removes the common indent level, after expanding tabs to 8 spaces.
|
--- Removes the common indent level, after expanding tabs to 8 spaces.
|
||||||
local function trim_indent(s)
|
local function trim_indent(s)
|
||||||
local indent_size = get_indent(s)
|
return vim.text.indent(0, s, { expandtab = 8 })
|
||||||
local trimmed = ''
|
|
||||||
for line in vim.gsplit(s, '\n') do
|
|
||||||
line = expandtabs(line)
|
|
||||||
trimmed = ('%s%s\n'):format(trimmed, line:sub(indent_size + 1))
|
|
||||||
end
|
|
||||||
return trimmed:sub(1, -2)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Gets raw buffer text in the node's range (+/- an offset), as a newline-delimited string.
|
--- Gets raw buffer text in the node's range (+/- an offset), as a newline-delimited string.
|
||||||
|
@@ -342,6 +342,7 @@ set(LUA_KEYMAP_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/keymap.lua)
|
|||||||
set(LUA_LOADER_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/loader.lua)
|
set(LUA_LOADER_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/loader.lua)
|
||||||
set(LUA_OPTIONS_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/_options.lua)
|
set(LUA_OPTIONS_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/_options.lua)
|
||||||
set(LUA_SHARED_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/shared.lua)
|
set(LUA_SHARED_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/shared.lua)
|
||||||
|
set(LUA_TEXT_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/text.lua)
|
||||||
|
|
||||||
file(GLOB API_HEADERS CONFIGURE_DEPENDS api/*.h)
|
file(GLOB API_HEADERS CONFIGURE_DEPENDS api/*.h)
|
||||||
list(REMOVE_ITEM API_HEADERS ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h)
|
list(REMOVE_ITEM API_HEADERS ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h)
|
||||||
@@ -624,6 +625,7 @@ add_custom_command(
|
|||||||
${LUA_DEFAULTS_MODULE_SOURCE} "vim._defaults"
|
${LUA_DEFAULTS_MODULE_SOURCE} "vim._defaults"
|
||||||
${LUA_OPTIONS_MODULE_SOURCE} "vim._options"
|
${LUA_OPTIONS_MODULE_SOURCE} "vim._options"
|
||||||
${LUA_SHARED_MODULE_SOURCE} "vim.shared"
|
${LUA_SHARED_MODULE_SOURCE} "vim.shared"
|
||||||
|
${LUA_TEXT_MODULE_SOURCE} "vim.text"
|
||||||
DEPENDS
|
DEPENDS
|
||||||
${CHAR_BLOB_GENERATOR}
|
${CHAR_BLOB_GENERATOR}
|
||||||
${LUA_INIT_PACKAGES_MODULE_SOURCE}
|
${LUA_INIT_PACKAGES_MODULE_SOURCE}
|
||||||
@@ -637,6 +639,7 @@ add_custom_command(
|
|||||||
${LUA_DEFAULTS_MODULE_SOURCE}
|
${LUA_DEFAULTS_MODULE_SOURCE}
|
||||||
${LUA_OPTIONS_MODULE_SOURCE}
|
${LUA_OPTIONS_MODULE_SOURCE}
|
||||||
${LUA_SHARED_MODULE_SOURCE}
|
${LUA_SHARED_MODULE_SOURCE}
|
||||||
|
${LUA_TEXT_MODULE_SOURCE}
|
||||||
VERBATIM
|
VERBATIM
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -500,6 +500,8 @@ a]],
|
|||||||
keep the lines under this line folded
|
keep the lines under this line folded
|
||||||
keep this line folded 1
|
keep this line folded 1
|
||||||
keep this line folded 2
|
keep this line folded 2
|
||||||
|
|
||||||
|
.
|
||||||
]])
|
]])
|
||||||
command('set foldmethod=indent shiftwidth=2 noautoindent')
|
command('set foldmethod=indent shiftwidth=2 noautoindent')
|
||||||
eq(1, fn.foldlevel(1))
|
eq(1, fn.foldlevel(1))
|
||||||
|
@@ -194,8 +194,7 @@ pcall(vim.cmd.edit, 'Xtest_swapredraw.lua')
|
|||||||
{100:vim.o.foldexpr} {100:=} {101:'v:lua.vim.treesitter.foldexpr()'} |
|
{100:vim.o.foldexpr} {100:=} {101:'v:lua.vim.treesitter.foldexpr()'} |
|
||||||
{102:+-- 3 lines: vim.defer_fn(function()·······························································}|
|
{102:+-- 3 lines: vim.defer_fn(function()·······························································}|
|
||||||
{104:pcall}{100:(vim.cmd.edit,} {101:'Xtest_swapredraw.lua'}{100:)} |
|
{104:pcall}{100:(vim.cmd.edit,} {101:'Xtest_swapredraw.lua'}{100:)} |
|
||||||
|
|
{105:~ }|*34
|
||||||
{105:~ }|*33
|
|
||||||
{106:Xtest_swapredraw.lua 1,1 All}|
|
{106:Xtest_swapredraw.lua 1,1 All}|
|
||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
@@ -589,8 +588,8 @@ describe('quitting swapfile dialog on startup stops TUI properly', function()
|
|||||||
api.nvim_chan_send(chan, 'q')
|
api.nvim_chan_send(chan, 'q')
|
||||||
retry(nil, nil, function()
|
retry(nil, nil, function()
|
||||||
eq(
|
eq(
|
||||||
{ '', '[Process exited 1]', '' },
|
{ '[Process exited 1]' },
|
||||||
eval("[1, 2, '$']->map({_, lnum -> getline(lnum)->trim(' ', 2)})")
|
eval("[1, 2, '$']->map({_, lnum -> getline(lnum)->trim(' ', 2)})->filter({_, s -> !empty(trim(s))})")
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -6,6 +6,7 @@ local n = require('test.functional.testnvim')()
|
|||||||
local clear, command, expect = n.clear, n.command, n.expect
|
local clear, command, expect = n.clear, n.command, n.expect
|
||||||
local source, write_file = n.source, t.write_file
|
local source, write_file = n.source, t.write_file
|
||||||
|
|
||||||
|
--- @return string
|
||||||
local function sixlines(text)
|
local function sixlines(text)
|
||||||
local result = ''
|
local result = ''
|
||||||
for _ = 1, 6 do
|
for _ = 1, 6 do
|
||||||
@@ -16,6 +17,9 @@ end
|
|||||||
|
|
||||||
local function diff(text, nodedent)
|
local function diff(text, nodedent)
|
||||||
local fname = t.tmpname()
|
local fname = t.tmpname()
|
||||||
|
finally(function()
|
||||||
|
os.remove(fname)
|
||||||
|
end)
|
||||||
command('w! ' .. fname)
|
command('w! ' .. fname)
|
||||||
n.poke_eventloop()
|
n.poke_eventloop()
|
||||||
local data = io.open(fname):read('*all')
|
local data = io.open(fname):read('*all')
|
||||||
@@ -24,7 +28,6 @@ local function diff(text, nodedent)
|
|||||||
else
|
else
|
||||||
t.eq(t.dedent(text), data)
|
t.eq(t.dedent(text), data)
|
||||||
end
|
end
|
||||||
os.remove(fname)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe('character classes in regexp', function()
|
describe('character classes in regexp', function()
|
||||||
@@ -38,7 +41,7 @@ describe('character classes in regexp', function()
|
|||||||
local punct4 = '{|}~'
|
local punct4 = '{|}~'
|
||||||
local ctrl2 = '\127\128\130\144\155'
|
local ctrl2 = '\127\128\130\144\155'
|
||||||
local iso_text = '\166\177\188\199\211\233' -- "¦±¼ÇÓé" in utf-8
|
local iso_text = '\166\177\188\199\211\233' -- "¦±¼ÇÓé" in utf-8
|
||||||
setup(function()
|
local function do_setup(no_dedent)
|
||||||
-- The original test32.in file was not in utf-8 encoding and did also
|
-- The original test32.in file was not in utf-8 encoding and did also
|
||||||
-- contain some control characters. We use lua escape sequences to write
|
-- contain some control characters. We use lua escape sequences to write
|
||||||
-- them to the test file.
|
-- them to the test file.
|
||||||
@@ -52,8 +55,9 @@ describe('character classes in regexp', function()
|
|||||||
.. punct4
|
.. punct4
|
||||||
.. ctrl2
|
.. ctrl2
|
||||||
.. iso_text
|
.. iso_text
|
||||||
write_file('test36.in', sixlines(line))
|
write_file('test36.in', sixlines(line), no_dedent)
|
||||||
end)
|
end
|
||||||
|
setup(do_setup)
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear()
|
clear()
|
||||||
command('e test36.in')
|
command('e test36.in')
|
||||||
@@ -288,7 +292,10 @@ describe('character classes in regexp', function()
|
|||||||
ABCDEFGHIXYZ
|
ABCDEFGHIXYZ
|
||||||
ABCDEFGHIXYZ]])
|
ABCDEFGHIXYZ]])
|
||||||
end)
|
end)
|
||||||
it([["\%1l^#.*" does not match on a line starting with "#". (vim-patch:7.4.1305)]], function()
|
pending(
|
||||||
|
[["\%1l^#.*" does not match on a line starting with "#". (vim-patch:7.4.1305)]],
|
||||||
|
function()
|
||||||
|
-- do_setup(true)
|
||||||
source([[
|
source([[
|
||||||
1 s/\%#=0\%1l^\t...//g
|
1 s/\%#=0\%1l^\t...//g
|
||||||
2 s/\%#=1\%2l^\t...//g
|
2 s/\%#=1\%2l^\t...//g
|
||||||
@@ -296,8 +303,7 @@ describe('character classes in regexp', function()
|
|||||||
4 s/\%#=0\%4l^\t...//g
|
4 s/\%#=0\%4l^\t...//g
|
||||||
5 s/\%#=1\%5l^\t...//g
|
5 s/\%#=1\%5l^\t...//g
|
||||||
6 s/\%#=2\%6l^\t...//g]])
|
6 s/\%#=2\%6l^\t...//g]])
|
||||||
diff(
|
local text = sixlines(
|
||||||
sixlines(
|
|
||||||
string.sub(punct1, 1)
|
string.sub(punct1, 1)
|
||||||
.. digits
|
.. digits
|
||||||
.. punct2
|
.. punct2
|
||||||
@@ -308,8 +314,9 @@ describe('character classes in regexp', function()
|
|||||||
.. ctrl2
|
.. ctrl2
|
||||||
.. iso_text
|
.. iso_text
|
||||||
)
|
)
|
||||||
|
diff(text)
|
||||||
|
end
|
||||||
)
|
)
|
||||||
end)
|
|
||||||
it('does not convert character class ranges to an incorrect class', function()
|
it('does not convert character class ranges to an incorrect class', function()
|
||||||
source([[
|
source([[
|
||||||
1 s/\%#=0[0-z]//g
|
1 s/\%#=0[0-z]//g
|
||||||
@@ -319,9 +326,9 @@ describe('character classes in regexp', function()
|
|||||||
5 s/\%#=1[^0-z]//g
|
5 s/\%#=1[^0-z]//g
|
||||||
6 s/\%#=2[^0-z]//g
|
6 s/\%#=2[^0-z]//g
|
||||||
]])
|
]])
|
||||||
diff(
|
local text = string.rep(ctrl1 .. punct1 .. punct4 .. ctrl2 .. iso_text .. '\n', 3)
|
||||||
string.rep(ctrl1 .. punct1 .. punct4 .. ctrl2 .. iso_text .. '\n', 3)
|
|
||||||
.. string.rep(digits .. punct2 .. upper .. punct3 .. lower .. '\n', 3)
|
.. string.rep(digits .. punct2 .. upper .. punct3 .. lower .. '\n', 3)
|
||||||
)
|
text = text:gsub('\t', ''):gsub('\n\t', '\n')
|
||||||
|
diff(text)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
@@ -112,6 +112,7 @@ describe('Visual block mode', function()
|
|||||||
line1
|
line1
|
||||||
line2
|
line2
|
||||||
line3
|
line3
|
||||||
|
.
|
||||||
]])
|
]])
|
||||||
|
|
||||||
-- Test for Visual block insert when virtualedit=all and utf-8 encoding.
|
-- Test for Visual block insert when virtualedit=all and utf-8 encoding.
|
||||||
@@ -123,6 +124,7 @@ describe('Visual block mode', function()
|
|||||||
x line1
|
x line1
|
||||||
x line2
|
x line2
|
||||||
x line3
|
x line3
|
||||||
|
.
|
||||||
]])
|
]])
|
||||||
|
|
||||||
-- Test for Visual block append when virtualedit=all.
|
-- Test for Visual block append when virtualedit=all.
|
||||||
@@ -132,6 +134,7 @@ describe('Visual block mode', function()
|
|||||||
x x line1
|
x x line1
|
||||||
x x line2
|
x x line2
|
||||||
x x line3
|
x x line3
|
||||||
|
.
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@@ -13,8 +13,6 @@ local eval = n.eval
|
|||||||
local eq = t.eq
|
local eq = t.eq
|
||||||
|
|
||||||
local function expect_empty_buffer()
|
local function expect_empty_buffer()
|
||||||
-- The space will be removed by t.dedent but is needed because dedent
|
|
||||||
-- will fail if it can not find the common indent of the given lines.
|
|
||||||
return expect('')
|
return expect('')
|
||||||
end
|
end
|
||||||
local function expect_line(line)
|
local function expect_line(line)
|
||||||
|
@@ -200,6 +200,7 @@ describe('eval', function()
|
|||||||
abcFc=]])
|
abcFc=]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- luacheck: ignore 611 (Line contains only whitespace)
|
||||||
it('appending NL with setreg()', function()
|
it('appending NL with setreg()', function()
|
||||||
command('so test_eval_setup.vim')
|
command('so test_eval_setup.vim')
|
||||||
|
|
||||||
@@ -222,6 +223,7 @@ describe('eval', function()
|
|||||||
command([[call SetReg('D', "\n", 'l')]])
|
command([[call SetReg('D', "\n", 'l')]])
|
||||||
command([[call SetReg('E', "\n")]])
|
command([[call SetReg('E', "\n")]])
|
||||||
command([[call SetReg('F', "\n", 'b')]])
|
command([[call SetReg('F', "\n", 'b')]])
|
||||||
|
command("$put ='.'")
|
||||||
expect([[
|
expect([[
|
||||||
|
|
||||||
{{{2 setreg('A', ']] .. '\000' .. [[')
|
{{{2 setreg('A', ']] .. '\000' .. [[')
|
||||||
@@ -256,7 +258,8 @@ describe('eval', function()
|
|||||||
F: type ]] .. "\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000" .. [[ (['abcF2', ''])
|
F: type ]] .. "\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000" .. [[ (['abcF2', ''])
|
||||||
==
|
==
|
||||||
=abcF2=
|
=abcF2=
|
||||||
]])
|
|
||||||
|
.]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('setting and appending list with setreg()', function()
|
it('setting and appending list with setreg()', function()
|
||||||
|
@@ -62,12 +62,12 @@ describe("'listchars'", function()
|
|||||||
..bb>---<<$
|
..bb>---<<$
|
||||||
...cccc><$
|
...cccc><$
|
||||||
dd........ee<<>-$
|
dd........ee<<>-$
|
||||||
<$
|
$
|
||||||
>-------aa>-----$
|
>-------aa>-----$
|
||||||
..bb>---..$
|
..bb>---..$
|
||||||
...cccc>.$
|
...cccc>.$
|
||||||
dd........ee..>-$
|
dd........ee..>-$
|
||||||
.$]])
|
$]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('works with :list', function()
|
it('works with :list', function()
|
||||||
|
@@ -7,7 +7,133 @@ local eq = t.eq
|
|||||||
describe('vim.text', function()
|
describe('vim.text', function()
|
||||||
before_each(clear)
|
before_each(clear)
|
||||||
|
|
||||||
describe('hexencode() and hexdecode()', function()
|
describe('indent()', function()
|
||||||
|
it('validation', function()
|
||||||
|
t.matches('size%: expected number, got string', t.pcall_err(vim.text.indent, 'x', 'x'))
|
||||||
|
t.matches('size%: expected number, got nil', t.pcall_err(vim.text.indent, nil, 'x'))
|
||||||
|
t.matches('opts%: expected table, got string', t.pcall_err(vim.text.indent, 0, 'x', 'z'))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('basic cases', function()
|
||||||
|
-- Basic cases.
|
||||||
|
eq({ '', 0 }, { vim.text.indent(0, '') })
|
||||||
|
eq({ '', 0 }, { vim.text.indent(2, '') })
|
||||||
|
eq({ ' a', 4 }, { vim.text.indent(2, ' a') })
|
||||||
|
eq({ ' a\n b', 4 }, { vim.text.indent(2, ' a\n b') })
|
||||||
|
eq({ '\t\ta', 1 }, { vim.text.indent(2, '\ta') })
|
||||||
|
eq({ ' a\n\n', 5 }, { vim.text.indent(1, ' a\n\n') })
|
||||||
|
-- Indent 1 (tab) => 0. Starting with empty + blank lines.
|
||||||
|
eq({ '\n\naa a aa', 1 }, { vim.text.indent(0, '\n \n aa a aa') })
|
||||||
|
-- Indent 1 (tab) => 2 (tabs). Starting with empty + blank lines, 1-tab indent.
|
||||||
|
eq({ '\n\t\t\n\t\taa a aa', 1 }, { vim.text.indent(2, '\n\t\n\taa a aa') })
|
||||||
|
|
||||||
|
-- Indent 4 => 2, expandtab=false preserves tabs after the common indent.
|
||||||
|
eq(
|
||||||
|
{ ' foo\n bar\n \tbaz\n', 4 },
|
||||||
|
{ vim.text.indent(2, ' foo\n bar\n \tbaz\n') }
|
||||||
|
)
|
||||||
|
-- Indent 9 => 3, expandtab=true.
|
||||||
|
eq(
|
||||||
|
{ ' foo\n\n bar \t baz\n', 9 },
|
||||||
|
{ vim.text.indent(3, '\t foo\n\n bar \t baz\n', { expandtab = 8 }) }
|
||||||
|
)
|
||||||
|
-- Indent 9 => 8, expandtab=true.
|
||||||
|
eq(
|
||||||
|
{ ' foo\n\n bar\n', 9 },
|
||||||
|
{ vim.text.indent(8, '\t foo\n\n bar\n', { expandtab = 8 }) }
|
||||||
|
)
|
||||||
|
-- Dedent: 5 => 0.
|
||||||
|
eq({ ' foo\n\nbar\n', 5 }, { vim.text.indent(0, ' foo\n\n bar\n') })
|
||||||
|
-- Dedent: 1 => 0. Empty lines are ignored when deciding "common indent".
|
||||||
|
eq(
|
||||||
|
{ ' \n \nfoo\n\nbar\nbaz\n \n', 1 },
|
||||||
|
{ vim.text.indent(0, ' \n \n foo\n\n bar\n baz\n \n') }
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('real-world cases', function()
|
||||||
|
-- Dedent.
|
||||||
|
eq({
|
||||||
|
[[
|
||||||
|
bufs:
|
||||||
|
nvim args: 3
|
||||||
|
lua args: {
|
||||||
|
[0] = "foo.lua"
|
||||||
|
}
|
||||||
|
]],
|
||||||
|
10,
|
||||||
|
}, {
|
||||||
|
vim.text.indent(
|
||||||
|
0,
|
||||||
|
[[
|
||||||
|
bufs:
|
||||||
|
nvim args: 3
|
||||||
|
lua args: {
|
||||||
|
[0] = "foo.lua"
|
||||||
|
}
|
||||||
|
]]
|
||||||
|
),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Indent 0 => 2.
|
||||||
|
eq({
|
||||||
|
[[
|
||||||
|
# yay
|
||||||
|
|
||||||
|
local function foo()
|
||||||
|
if true then
|
||||||
|
# yay
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
]],
|
||||||
|
0,
|
||||||
|
}, {
|
||||||
|
vim.text.indent(
|
||||||
|
2,
|
||||||
|
[[
|
||||||
|
# yay
|
||||||
|
|
||||||
|
local function foo()
|
||||||
|
if true then
|
||||||
|
# yay
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
]]
|
||||||
|
),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- 1-tab indent, last line spaces < tabsize.
|
||||||
|
-- Preserves tab char immediately following the indent.
|
||||||
|
eq({ 'text\n\tmatch\nmatch\ntext\n', 1 }, {
|
||||||
|
vim.text.indent(0, (([[
|
||||||
|
text
|
||||||
|
match
|
||||||
|
match
|
||||||
|
text
|
||||||
|
]]):gsub('\n%s-([\n]?)$', '\n%1'))),
|
||||||
|
})
|
||||||
|
|
||||||
|
-- 1-tab indent, last line spaces=tabsize.
|
||||||
|
eq({ 'text\n match\nmatch\ntext\n', 6 }, {
|
||||||
|
vim.text.indent(
|
||||||
|
0,
|
||||||
|
[[
|
||||||
|
text
|
||||||
|
match
|
||||||
|
match
|
||||||
|
text
|
||||||
|
]],
|
||||||
|
{ expandtab = 6 }
|
||||||
|
),
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
describe('hexencode(), hexdecode()', function()
|
||||||
it('works', function()
|
it('works', function()
|
||||||
local cases = {
|
local cases = {
|
||||||
{ 'Hello world!', '48656C6C6F20776F726C6421' },
|
{ 'Hello world!', '48656C6C6F20776F726C6421' },
|
||||||
@@ -21,13 +147,13 @@ describe('vim.text', function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('works with very large strings', function()
|
it('with very large strings', function()
|
||||||
local input, output = string.rep('😂', 2 ^ 16), string.rep('F09F9882', 2 ^ 16)
|
local input, output = string.rep('😂', 2 ^ 16), string.rep('F09F9882', 2 ^ 16)
|
||||||
eq(output, vim.text.hexencode(input))
|
eq(output, vim.text.hexencode(input))
|
||||||
eq(input, vim.text.hexdecode(output))
|
eq(input, vim.text.hexdecode(output))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('errors on invalid input', function()
|
it('invalid input', function()
|
||||||
-- Odd number of hex characters
|
-- Odd number of hex characters
|
||||||
do
|
do
|
||||||
local res, err = vim.text.hexdecode('ABC')
|
local res, err = vim.text.hexdecode('ABC')
|
||||||
|
@@ -609,12 +609,13 @@ function M._new_argv(...)
|
|||||||
return args, env, io_extra
|
return args, env, io_extra
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Dedents string arguments and inserts the resulting text into the current buffer.
|
||||||
--- @param ... string
|
--- @param ... string
|
||||||
function M.insert(...)
|
function M.insert(...)
|
||||||
nvim_feed('i')
|
nvim_feed('i')
|
||||||
for _, v in ipairs({ ... }) do
|
for _, v in ipairs({ ... }) do
|
||||||
local escaped = v:gsub('<', '<lt>')
|
local escaped = v:gsub('<', '<lt>')
|
||||||
M.feed(escaped)
|
M.feed(escaped) -- This also dedents :P
|
||||||
end
|
end
|
||||||
nvim_feed('<ESC>')
|
nvim_feed('<ESC>')
|
||||||
end
|
end
|
||||||
@@ -812,6 +813,7 @@ function M.rmdir(path)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- @deprecated Use `t.pcall_err()` to check failure, or `n.command()` to check success.
|
||||||
function M.exc_exec(cmd)
|
function M.exc_exec(cmd)
|
||||||
M.command(([[
|
M.command(([[
|
||||||
try
|
try
|
||||||
|
@@ -82,7 +82,7 @@ describe('treesitter node API', function()
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
exec_lua(function()
|
exec_lua(function()
|
||||||
local parser = vim.treesitter.get_parser(0, 'c')
|
local parser = assert(vim.treesitter.get_parser(0, 'c'))
|
||||||
local tree = parser:parse()[1]
|
local tree = parser:parse()[1]
|
||||||
_G.root = tree:root()
|
_G.root = tree:root()
|
||||||
vim.treesitter.language.inspect('c')
|
vim.treesitter.language.inspect('c')
|
||||||
@@ -92,7 +92,7 @@ describe('treesitter node API', function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
exec_lua 'node = root:descendant_for_range(0, 11, 0, 16)'
|
exec_lua 'node = root:descendant_for_range(0, 9, 0, 14)'
|
||||||
eq('int x', lua_eval('node_text(node)'))
|
eq('int x', lua_eval('node_text(node)'))
|
||||||
|
|
||||||
exec_lua 'node = node:next_sibling()'
|
exec_lua 'node = node:next_sibling()'
|
||||||
|
@@ -386,8 +386,8 @@ void ui_refresh(void)
|
|||||||
[[((primitive_type) @c-keyword (#any-of? @c-keyword "int" "float"))]]
|
[[((primitive_type) @c-keyword (#any-of? @c-keyword "int" "float"))]]
|
||||||
)
|
)
|
||||||
eq({
|
eq({
|
||||||
{ 'c-keyword', 'primitive_type', { 2, 2, 2, 5 }, 'int' },
|
{ 'c-keyword', 'primitive_type', { 2, 0, 2, 3 }, 'int' },
|
||||||
{ 'c-keyword', 'primitive_type', { 3, 4, 3, 7 }, 'int' },
|
{ 'c-keyword', 'primitive_type', { 3, 2, 3, 5 }, 'int' },
|
||||||
}, res0)
|
}, res0)
|
||||||
|
|
||||||
local res1 = exec_lua(
|
local res1 = exec_lua(
|
||||||
@@ -401,9 +401,9 @@ void ui_refresh(void)
|
|||||||
]]
|
]]
|
||||||
)
|
)
|
||||||
eq({
|
eq({
|
||||||
{ 'fizzbuzz-strings', 'string_literal', { 6, 15, 6, 38 }, '"number= %d FizzBuzz\\n"' },
|
{ 'fizzbuzz-strings', 'string_literal', { 6, 13, 6, 36 }, '"number= %d FizzBuzz\\n"' },
|
||||||
{ 'fizzbuzz-strings', 'string_literal', { 8, 15, 8, 34 }, '"number= %d Fizz\\n"' },
|
{ 'fizzbuzz-strings', 'string_literal', { 8, 13, 8, 32 }, '"number= %d Fizz\\n"' },
|
||||||
{ 'fizzbuzz-strings', 'string_literal', { 10, 15, 10, 34 }, '"number= %d Buzz\\n"' },
|
{ 'fizzbuzz-strings', 'string_literal', { 10, 13, 10, 32 }, '"number= %d Buzz\\n"' },
|
||||||
}, res1)
|
}, res1)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -608,9 +608,9 @@ void ui_refresh(void)
|
|||||||
|
|
||||||
eq(
|
eq(
|
||||||
{
|
{
|
||||||
{ 0, 2, 0, 8 },
|
{ 0, 0, 0, 6 },
|
||||||
{ 1, 2, 1, 8 },
|
{ 1, 0, 1, 6 },
|
||||||
{ 2, 2, 2, 8 },
|
{ 2, 0, 2, 6 },
|
||||||
},
|
},
|
||||||
test(
|
test(
|
||||||
[[
|
[[
|
||||||
@@ -636,9 +636,9 @@ void ui_refresh(void)
|
|||||||
|
|
||||||
eq(
|
eq(
|
||||||
{
|
{
|
||||||
{ 0, 2, 0, 7 },
|
{ 0, 0, 0, 5 },
|
||||||
{ 1, 2, 1, 8 },
|
{ 1, 0, 1, 6 },
|
||||||
{ 2, 2, 2, 7 },
|
{ 2, 0, 2, 5 },
|
||||||
},
|
},
|
||||||
test(
|
test(
|
||||||
[[
|
[[
|
||||||
@@ -675,9 +675,9 @@ void ui_refresh(void)
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
eq({
|
eq({
|
||||||
{ 0, 2, 0, 12 },
|
{ 0, 0, 0, 10 },
|
||||||
{ 1, 2, 1, 12 },
|
{ 1, 0, 1, 10 },
|
||||||
{ 2, 2, 2, 12 },
|
{ 2, 0, 2, 10 },
|
||||||
}, result)
|
}, result)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@@ -2067,9 +2067,9 @@ describe('float window', function()
|
|||||||
screen:expect{grid=[[
|
screen:expect{grid=[[
|
||||||
neeed some dummy |
|
neeed some dummy |
|
||||||
background text |
|
background text |
|
||||||
to {1: halloj! }{23:e}ffect |
|
to sh{1: halloj! }{23:f}ect |
|
||||||
of {1: BORDAA }{24:n}ding |
|
of co{1: BORDAA }{24:i}ng |
|
||||||
of {23:b}{24:order sha}dow |
|
of bo{23:r}{24:der shado}w |
|
||||||
^ |
|
^ |
|
||||||
|
|
|
|
||||||
]]}
|
]]}
|
||||||
|
@@ -502,9 +502,7 @@ describe('ext_hlstate detailed highlights', function()
|
|||||||
local num_lines = 500
|
local num_lines = 500
|
||||||
insert('first line\n')
|
insert('first line\n')
|
||||||
for _ = 1, num_lines do
|
for _ = 1, num_lines do
|
||||||
insert([[
|
api.nvim_paste(' line\n', false, -1)
|
||||||
line
|
|
||||||
]])
|
|
||||||
end
|
end
|
||||||
insert('last line')
|
insert('last line')
|
||||||
|
|
||||||
|
@@ -95,8 +95,7 @@ describe('Diff mode screen with 3 diffs open', function()
|
|||||||
{7: }{8: 9 }{4: BBB }│{7: }{8: 9 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: 9 }{4: BBB }│{7: }{8: 9 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 10 }{4: BBB }│{7: }{8: 10 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: 10 }{4: BBB }│{7: }{8: 10 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 12 } │{7: }{8: 12 } │{7: }{8: 6 } |
|
{1:~ }│{1:~ }│{1:~ }|*3
|
||||||
{1:~ }│{1:~ }│{1:~ }|*2
|
|
||||||
{3:<-functional-diff-screen-1.3 [+] }{2:<est-functional-diff-screen-1.2 Xtest-functional-diff-screen-1 }|
|
{3:<-functional-diff-screen-1.3 [+] }{2:<est-functional-diff-screen-1.2 Xtest-functional-diff-screen-1 }|
|
||||||
:2,6diffget screen-1.2 |
|
:2,6diffget screen-1.2 |
|
||||||
]])
|
]])
|
||||||
@@ -114,8 +113,7 @@ describe('Diff mode screen with 3 diffs open', function()
|
|||||||
{7: }{8: 4 }{4: }{27:BBB}{4: }│{7: }{8: 6 }{4: }{27:BBB}{4: }│{7: }{8: 4 }{4: }{27:AAA}{4: }|
|
{7: }{8: 4 }{4: }{27:BBB}{4: }│{7: }{8: 6 }{4: }{27:BBB}{4: }│{7: }{8: 4 }{4: }{27:AAA}{4: }|
|
||||||
{7: }{8: 5 }{4: }{27:BBB}{4: }│{7: }{8: 7 }{4: }{27:BBB}{4: }│{7: }{8: 5 }{4: }{27:AAA}{4: }|
|
{7: }{8: 5 }{4: }{27:BBB}{4: }│{7: }{8: 7 }{4: }{27:BBB}{4: }│{7: }{8: 5 }{4: }{27:AAA}{4: }|
|
||||||
{7: }{8: }{23:---------------------------}│{7: }{8: 8 }{22:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: }{23:---------------------------}│{7: }{8: 8 }{22:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 6 } │{7: }{8: 9 } │{7: }{8: 6 } |
|
{1:~ }│{1:~ }│{1:~ }|*6
|
||||||
{1:~ }│{1:~ }│{1:~ }|*5
|
|
||||||
{2:<test-functional-diff-screen-1.3 }{3:<functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{2:<test-functional-diff-screen-1.3 }{3:<functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:5,7diffget screen-1.3 |
|
:5,7diffget screen-1.3 |
|
||||||
]])
|
]])
|
||||||
@@ -136,8 +134,7 @@ describe('Diff mode screen with 3 diffs open', function()
|
|||||||
{7: }{8: 4 } BBB │{7: }{8: 9 } BBB │{7: }{8: 8 } BBB |
|
{7: }{8: 4 } BBB │{7: }{8: 9 } BBB │{7: }{8: 8 } BBB |
|
||||||
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 9 } BBB |
|
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 9 } BBB |
|
||||||
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 10 }{4:>>>>>>> branch1 }|
|
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 10 }{4:>>>>>>> branch1 }|
|
||||||
{7: }{8: 6 } │{7: }{8: 12 } │{7: }{8: 11 } |
|
{1:~ }│{1:~ }│{1:~ }|*3
|
||||||
{1:~ }│{1:~ }│{1:~ }|*2
|
|
||||||
{2:<test-functional-diff-screen-1.3 <est-functional-diff-screen-1.2 }{3:<st-functional-diff-screen-1 [+] }|
|
{2:<test-functional-diff-screen-1.3 <est-functional-diff-screen-1.2 }{3:<st-functional-diff-screen-1 [+] }|
|
||||||
:5,6diffget screen-1.2 |
|
:5,6diffget screen-1.2 |
|
||||||
]])
|
]])
|
||||||
@@ -158,8 +155,7 @@ describe('Diff mode screen with 3 diffs open', function()
|
|||||||
{7: }{8: 4 }{4: BBB }│{7: }{8: 9 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: 4 }{4: BBB }│{7: }{8: 9 }{4: BBB }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 7 } BBB |
|
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 7 } BBB |
|
||||||
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{22:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{22:>>>>>>> branch1 }│{7: }{8: }{23:---------------------------}|
|
||||||
{7: }{8: 6 } │{7: }{8: 12 } │{7: }{8: 8 } |
|
{1:~ }│{1:~ }│{1:~ }|*3
|
||||||
{1:~ }│{1:~ }│{1:~ }|*2
|
|
||||||
{2:<test-functional-diff-screen-1.3 }{3:<est-functional-diff-screen-1.2 }{2:<st-functional-diff-screen-1 [+] }|
|
{2:<test-functional-diff-screen-1.3 }{3:<est-functional-diff-screen-1.2 }{2:<st-functional-diff-screen-1 [+] }|
|
||||||
:6,8diffput screen-1 |
|
:6,8diffput screen-1 |
|
||||||
]])
|
]])
|
||||||
@@ -179,8 +175,7 @@ describe('Diff mode screen with 3 diffs open', function()
|
|||||||
{7: }{8: 4 } BBB │{7: }{8: 9 } BBB │{7: }{8: 8 } BBB |
|
{7: }{8: 4 } BBB │{7: }{8: 9 } BBB │{7: }{8: 8 } BBB |
|
||||||
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 9 } BBB |
|
{7: }{8: 5 } BBB │{7: }{8: 10 } BBB │{7: }{8: 9 } BBB |
|
||||||
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 10 }{4:>>>>>>> branch1 }|
|
{7: }{8: }{23:---------------------------}│{7: }{8: 11 }{4:>>>>>>> branch1 }│{7: }{8: 10 }{4:>>>>>>> branch1 }|
|
||||||
{7: }{8: 6 } │{7: }{8: 12 } │{7: }{8: 11 } |
|
{1:~ }│{1:~ }│{1:~ }|*3
|
||||||
{1:~ }│{1:~ }│{1:~ }|*2
|
|
||||||
{2:<test-functional-diff-screen-1.3 }{3:<est-functional-diff-screen-1.2 }{2:<st-functional-diff-screen-1 [+] }|
|
{2:<test-functional-diff-screen-1.3 }{3:<est-functional-diff-screen-1.2 }{2:<st-functional-diff-screen-1 [+] }|
|
||||||
:6,11diffput screen-1 |
|
:6,11diffput screen-1 |
|
||||||
]])
|
]])
|
||||||
@@ -276,8 +271,7 @@ something
|
|||||||
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 16 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|*7
|
||||||
{1:~ }│{1:~ }|*6
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:5,9diffget |
|
:5,9diffget |
|
||||||
]])
|
]])
|
||||||
@@ -300,8 +294,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 12 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 12 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 13 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 13 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 14 }something |
|
{7: }{8: 12 }something │{7: }{8: 14 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 15 } |
|
{1:~ }│{1:~ }|*4
|
||||||
{1:~ }│{1:~ }|*3
|
|
||||||
{2:Xtest-functional-diff-screen-1.2 }{3:Xtest-functional-diff-screen-1 [+] }|
|
{2:Xtest-functional-diff-screen-1.2 }{3:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:5,10diffget |
|
:5,10diffget |
|
||||||
]])
|
]])
|
||||||
@@ -322,8 +315,7 @@ something
|
|||||||
{7: }{8: 10 }common line │{7: }{8: 10 }common line |
|
{7: }{8: 10 }common line │{7: }{8: 10 }common line |
|
||||||
{7: }{8: 11 }common line │{7: }{8: 11 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 11 }common line |
|
||||||
{7: }{8: 12 }something │{7: }{8: 12 }something |
|
{7: }{8: 12 }something │{7: }{8: 12 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 13 } |
|
{1:~ }│{1:~ }|*6
|
||||||
{1:~ }│{1:~ }|*5
|
|
||||||
{2:Xtest-functional-diff-screen-1.2 }{3:Xtest-functional-diff-screen-1 [+] }|
|
{2:Xtest-functional-diff-screen-1.2 }{3:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:4,17diffget |
|
:4,17diffget |
|
||||||
]])
|
]])
|
||||||
@@ -349,7 +341,7 @@ something
|
|||||||
{7: }{8: 15 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 15 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: 16 }DEF │{7: }{8: 16 }DEF |
|
{7: }{8: 16 }DEF │{7: }{8: 16 }DEF |
|
||||||
{7: }{8: 17 }something │{7: }{8: 17 }something |
|
{7: }{8: 17 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 18 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:4,12diffget |
|
:4,12diffget |
|
||||||
]])
|
]])
|
||||||
@@ -376,7 +368,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -403,7 +395,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -430,7 +422,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -457,7 +449,7 @@ something
|
|||||||
{7: }{8: 12 }^common line │{7: }{8: 15 }common line |
|
{7: }{8: 12 }^common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 13 }something │{7: }{8: 17 }something |
|
{7: }{8: 13 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 14 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -484,7 +476,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: 12 }DEF │{7: }{8: 16 }DEF |
|
{7: }{8: 12 }DEF │{7: }{8: 16 }DEF |
|
||||||
{7: }{8: 13 }^something │{7: }{8: 17 }something |
|
{7: }{8: 13 }^something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 14 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -511,7 +503,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -538,7 +530,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -565,7 +557,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -591,7 +583,7 @@ something
|
|||||||
{7: }{8: 11 }^common line │{7: }{8: 14 }common line |
|
{7: }{8: 11 }^common line │{7: }{8: 14 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 15 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 15 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 16 }something |
|
{7: }{8: 12 }something │{7: }{8: 16 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 17 } |
|
{1:~ }│{1:~ }|
|
||||||
{1:~ }│{1:~ }|
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:e |
|
:e |
|
||||||
@@ -618,7 +610,7 @@ something
|
|||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 14 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 14 }{22:DEF }|
|
||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: 12 }^something │{7: }{8: 16 }something |
|
{7: }{8: 12 }^something │{7: }{8: 16 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 17 } |
|
{1:~ }│{1:~ }|
|
||||||
{1:~ }│{1:~ }|
|
{1:~ }│{1:~ }|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 [+] }|
|
||||||
:e |
|
:e |
|
||||||
@@ -646,7 +638,7 @@ something
|
|||||||
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 16 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -673,7 +665,7 @@ something
|
|||||||
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 14 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
{7: }{8: 15 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 16 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -700,7 +692,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 16 }{22:DEF }|
|
||||||
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
{7: }{8: 12 }something │{7: }{8: 17 }something |
|
||||||
{7: }{8: 13 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -727,7 +719,7 @@ something
|
|||||||
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
{7: }{8: 11 }common line │{7: }{8: 15 }common line |
|
||||||
{7: }{8: 12 }DEF │{7: }{8: 16 }DEF |
|
{7: }{8: 12 }DEF │{7: }{8: 16 }DEF |
|
||||||
{7: }{8: 13 }something │{7: }{8: 17 }^something |
|
{7: }{8: 13 }something │{7: }{8: 17 }^something |
|
||||||
{7: }{8: 14 } │{7: }{8: 18 } |
|
{1:~ }│{1:~ }|
|
||||||
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
{2:Xtest-functional-diff-screen-1.2 [+] }{3:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -757,8 +749,7 @@ d
|
|||||||
{7: }{8: 2 }{4:abc d }│{7: }{8: 1 }{27:// }{4:abc d }|
|
{7: }{8: 2 }{4:abc d }│{7: }{8: 1 }{27:// }{4:abc d }|
|
||||||
{7: }{8: 3 }{4:d }│{7: }{8: 2 }{27:// }{4:d }|
|
{7: }{8: 3 }{4:d }│{7: }{8: 2 }{27:// }{4:d }|
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 3 }{22:// d }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 3 }{22:// d }|
|
||||||
{7: }{8: 4 } │{7: }{8: 4 } |
|
{1:~ }│{1:~ }|*14
|
||||||
{1:~ }│{1:~ }|*13
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -794,8 +785,7 @@ void testFunction () {
|
|||||||
{7: }{8: 3 }{4: }{27:// }{4:} }│{7: }{8: 4 }{4: } }|
|
{7: }{8: 3 }{4: }{27:// }{4:} }│{7: }{8: 4 }{4: } }|
|
||||||
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 5 }{22: } }|
|
{7: }{8: }{23:-------------------------------------------}│{7: }{8: 5 }{22: } }|
|
||||||
{7: }{8: 4 }} │{7: }{8: 6 }} |
|
{7: }{8: 4 }} │{7: }{8: 6 }} |
|
||||||
{7: }{8: 5 } │{7: }{8: 7 } |
|
{1:~ }│{1:~ }|*12
|
||||||
{1:~ }│{1:~ }|*11
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -834,8 +824,7 @@ void testFunction () {
|
|||||||
{7: }{8: 6 }{22:?B }│{7: }{8: }{23:--------------------------------------------}|
|
{7: }{8: 6 }{22:?B }│{7: }{8: }{23:--------------------------------------------}|
|
||||||
{7: }{8: 7 }{22:?B }│{7: }{8: }{23:--------------------------------------------}|
|
{7: }{8: 7 }{22:?B }│{7: }{8: }{23:--------------------------------------------}|
|
||||||
{7: }{8: 8 }{22:?C }│{7: }{8: }{23:--------------------------------------------}|
|
{7: }{8: 8 }{22:?C }│{7: }{8: }{23:--------------------------------------------}|
|
||||||
{7: }{8: 9 } │{7: }{8: 4 } |
|
{1:~ }│{1:~ }|*10
|
||||||
{1:~ }│{1:~ }|*9
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -874,8 +863,7 @@ void testFunction () {
|
|||||||
{7: }{8: 6 }{27:?}{4:B }│{7: }{8: 2 }{27:!}{4:B }|
|
{7: }{8: 6 }{27:?}{4:B }│{7: }{8: 2 }{27:!}{4:B }|
|
||||||
{7: }{8: 7 }{27:?}{4:C }│{7: }{8: 3 }{27:!}{4:C }|
|
{7: }{8: 7 }{27:?}{4:C }│{7: }{8: 3 }{27:!}{4:C }|
|
||||||
{7: }{8: 8 }{22:?C }│{7: }{8: }{23:--------------------------------------------}|
|
{7: }{8: 8 }{22:?C }│{7: }{8: }{23:--------------------------------------------}|
|
||||||
{7: }{8: 9 } │{7: }{8: 4 } |
|
{1:~ }│{1:~ }|*10
|
||||||
{1:~ }│{1:~ }|*9
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:e |
|
:e |
|
||||||
]])
|
]])
|
||||||
@@ -1017,8 +1005,7 @@ something
|
|||||||
{7: }{8: 9 }HIL │{7: }{8: 9 }HIL |
|
{7: }{8: 9 }HIL │{7: }{8: 9 }HIL |
|
||||||
{7: }{8: 10 }common line │{7: }{8: 10 }common line |
|
{7: }{8: 10 }common line │{7: }{8: 10 }common line |
|
||||||
{7: }{8: 11 }something │{7: }{8: 11 }something |
|
{7: }{8: 11 }something │{7: }{8: 11 }something |
|
||||||
{7: }{8: 12 } │{7: }{8: 12 } |
|
{1:~ }│{1:~ }|*7
|
||||||
{1:~ }│{1:~ }|*6
|
|
||||||
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
{3:Xtest-functional-diff-screen-1.2 [+] }{2:Xtest-functional-diff-screen-1 }|
|
||||||
:1,19diffget |
|
:1,19diffget |
|
||||||
]])
|
]])
|
||||||
|
@@ -2329,14 +2329,15 @@ describe('builtin popupmenu', function()
|
|||||||
occaecat cupidatat non proident, sunt in culpa
|
occaecat cupidatat non proident, sunt in culpa
|
||||||
qui officia deserunt mollit anim id est
|
qui officia deserunt mollit anim id est
|
||||||
laborum.
|
laborum.
|
||||||
|
.
|
||||||
]])
|
]])
|
||||||
|
|
||||||
screen:expect([[
|
screen:expect([[
|
||||||
reprehenderit in voluptate velit esse cillum |
|
|
||||||
dolore eu fugiat nulla pariatur. Excepteur sint |
|
dolore eu fugiat nulla pariatur. Excepteur sint |
|
||||||
occaecat cupidatat non proident, sunt in culpa |
|
occaecat cupidatat non proident, sunt in culpa |
|
||||||
qui officia deserunt mollit anim id est |
|
qui officia deserunt mollit anim id est |
|
||||||
laborum. |
|
laborum. |
|
||||||
|
. |
|
||||||
^ |
|
^ |
|
||||||
{4:[No Name] [+] }|
|
{4:[No Name] [+] }|
|
||||||
Lorem ipsum dolor sit amet, consectetur |
|
Lorem ipsum dolor sit amet, consectetur |
|
||||||
|
@@ -494,9 +494,8 @@ function Screen:expect(expected, attr_ids, ...)
|
|||||||
|
|
||||||
local expected_rows = {} --- @type string[]
|
local expected_rows = {} --- @type string[]
|
||||||
if grid then
|
if grid then
|
||||||
-- Remove the last line and dedent. Note that gsub returns more then one
|
-- Dedent (ignores last line if it is blank).
|
||||||
-- value.
|
grid = dedent(grid, 0)
|
||||||
grid = dedent(grid:gsub('\n[ ]+$', ''), 0)
|
|
||||||
for row in grid:gmatch('[^\n]+') do
|
for row in grid:gmatch('[^\n]+') do
|
||||||
table.insert(expected_rows, row)
|
table.insert(expected_rows, row)
|
||||||
end
|
end
|
||||||
|
@@ -652,7 +652,7 @@ describe('search highlighting', function()
|
|||||||
topline = 0,
|
topline = 0,
|
||||||
botline = 3,
|
botline = 3,
|
||||||
curline = 0,
|
curline = 0,
|
||||||
curcol = 11,
|
curcol = 9,
|
||||||
linecount = 2,
|
linecount = 2,
|
||||||
sum_scroll_delta = 0,
|
sum_scroll_delta = 0,
|
||||||
},
|
},
|
||||||
|
@@ -148,6 +148,7 @@ end
|
|||||||
--- @param actual string
|
--- @param actual string
|
||||||
--- @return boolean
|
--- @return boolean
|
||||||
function M.matches(pat, actual)
|
function M.matches(pat, actual)
|
||||||
|
assert(pat and pat ~= '', 'pat must be a non-empty string')
|
||||||
if nil ~= string.match(actual, pat) then
|
if nil ~= string.match(actual, pat) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
@@ -641,28 +642,9 @@ end
|
|||||||
--- @param leave_indent? integer
|
--- @param leave_indent? integer
|
||||||
--- @return string
|
--- @return string
|
||||||
function M.dedent(str, leave_indent)
|
function M.dedent(str, leave_indent)
|
||||||
-- find minimum common indent across lines
|
-- Last blank line often has non-matching indent, so remove it.
|
||||||
local indent --- @type string?
|
str = str:gsub('\n[ ]+$', '\n')
|
||||||
for line in str:gmatch('[^\n]+') do
|
return (vim.text.indent(leave_indent or 0, str))
|
||||||
local line_indent = line:match('^%s+') or ''
|
|
||||||
if indent == nil or #line_indent < #indent then
|
|
||||||
indent = line_indent
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not indent or #indent == 0 then
|
|
||||||
-- no minimum common indent
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
local left_indent = (' '):rep(leave_indent or 0)
|
|
||||||
-- create a pattern for the indent
|
|
||||||
indent = indent:gsub('%s', '[ \t]')
|
|
||||||
-- strip it from the first line
|
|
||||||
str = str:gsub('^' .. indent, left_indent)
|
|
||||||
-- strip it from the remaining lines
|
|
||||||
str = str:gsub('[\n]' .. indent, '\n' .. left_indent)
|
|
||||||
return str
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.intchar2lua(ch)
|
function M.intchar2lua(ch)
|
||||||
|
Reference in New Issue
Block a user