aboutsummaryrefslogtreecommitdiff
path: root/test/functional/api/vim_spec.lua
diff options
context:
space:
mode:
authorglepnir <glephunter@gmail.com>2025-05-05 20:58:36 +0800
committerGitHub <noreply@github.com>2025-05-05 05:58:36 -0700
commit1e7406fa38eef8cb9812272196a97cf530218c4e (patch)
tree080d988bb873197c92e748dc488f35f9e9326882 /test/functional/api/vim_spec.lua
parent912388f51786eab37ad92235f9baf762232d9cf1 (diff)
downloadrneovim-1e7406fa38eef8cb9812272196a97cf530218c4e.tar.gz
rneovim-1e7406fa38eef8cb9812272196a97cf530218c4e.tar.bz2
rneovim-1e7406fa38eef8cb9812272196a97cf530218c4e.zip
feat(api): nvim_cmd supports plus ("+cmd", "++opt") flags #30103
Problem: nvim_cmd does not handle plus flags. Solution: In nvim_cmd, parse the flags and set the relevant `ea` fields.
Diffstat (limited to 'test/functional/api/vim_spec.lua')
-rw-r--r--test/functional/api/vim_spec.lua163
1 files changed, 163 insertions, 0 deletions
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index 3e18fb357b..7dae67c723 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -5233,6 +5233,169 @@ describe('API', function()
assert_alive()
eq(false, exec_lua('return _G.success'))
end)
+
+ it('handles +flags correctly', function()
+ -- Write a file for testing +flags
+ t.write_file('testfile', 'Line 1\nLine 2\nLine 3', false, false)
+
+ -- Test + command (go to the last line)
+ local result = exec_lua([[
+ local parsed = vim.api.nvim_parse_cmd('edit + testfile', {})
+ vim.cmd(parsed)
+ return { vim.fn.line('.'), parsed.args, parsed.cmd }
+ ]])
+ eq({ 3, { '+ testfile' }, 'edit' }, result)
+
+ -- Test +{num} command (go to line number)
+ result = exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit +1 testfile', {}))
+ return vim.fn.line('.')
+ ]])
+ eq(1, result)
+
+ -- Test +/{pattern} command (go to line with pattern)
+ result = exec_lua([[
+ local parsed = vim.api.nvim_parse_cmd('edit +/Line\\ 2 testfile', {})
+ vim.cmd(parsed)
+ return {vim.fn.line('.'), parsed.args}
+ ]])
+ eq({ 2, { '+/Line\\ 2 testfile' } }, result)
+
+ -- Test +{command} command (execute a command after opening the file)
+ result = exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit +set\\ nomodifiable testfile', {}))
+ return vim.bo.modifiable
+ ]])
+ eq(false, result)
+
+ -- Test ++ flags structure in parsed command
+ result = exec_lua([[
+ local parsed = vim.api.nvim_parse_cmd('botright edit + testfile', {})
+ vim.cmd(parsed)
+ return { vim.fn.line('.'), parsed.cmd, parsed.args, parsed.mods.split }
+ ]])
+ eq({ 3, 'edit', { '+ testfile' }, 'botright' }, result)
+
+ -- Clean up
+ os.remove('testfile')
+ end)
+
+ it('handles various ++ flags correctly', function()
+ -- Test ++ff flag
+ local result = exec_lua [[
+ local parsed = vim.api.nvim_parse_cmd('edit ++ff=mac test_ff_mac.txt', {})
+ vim.cmd(parsed)
+ return parsed.args
+ ]]
+ eq({ '++ff=mac test_ff_mac.txt' }, result)
+ eq('mac', api.nvim_get_option_value('fileformat', {}))
+ eq('test_ff_mac.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+
+ exec_lua [[
+ vim.cmd(vim.api.nvim_parse_cmd('edit ++fileformat=unix test_ff_unix.txt', {}))
+ ]]
+ eq('unix', api.nvim_get_option_value('fileformat', {}))
+ eq('test_ff_unix.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+
+ -- Test ++enc flag
+ exec_lua [[
+ vim.cmd(vim.api.nvim_parse_cmd('edit ++enc=utf-32 test_enc.txt', {}))
+ ]]
+ eq('ucs-4', api.nvim_get_option_value('fileencoding', {}))
+ eq('test_enc.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+
+ -- Test ++bin and ++nobin flags
+ exec_lua [[
+ vim.cmd(vim.api.nvim_parse_cmd('edit ++bin test_bin.txt', {}))
+ ]]
+ eq(true, api.nvim_get_option_value('binary', {}))
+ eq('test_bin.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+
+ exec_lua [[
+ vim.cmd(vim.api.nvim_parse_cmd('edit ++nobin test_nobin.txt', {}))
+ ]]
+ eq(false, api.nvim_get_option_value('binary', {}))
+ eq('test_nobin.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+
+ -- Test multiple flags together
+ exec_lua [[
+ vim.cmd(vim.api.nvim_parse_cmd('edit ++ff=mac ++enc=utf-32 ++bin test_multi.txt', {}))
+ ]]
+ eq(true, api.nvim_get_option_value('binary', {}))
+ eq('mac', api.nvim_get_option_value('fileformat', {}))
+ eq('ucs-4', api.nvim_get_option_value('fileencoding', {}))
+ eq('test_multi.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t'))
+ end)
+
+ it('handles invalid and incorrect ++ flags gracefully', function()
+ -- Test invalid ++ff flag
+ local result = exec_lua [[
+ local cmd = vim.api.nvim_parse_cmd('edit ++ff=invalid test_invalid_ff.txt', {})
+ local _, err = pcall(vim.cmd, cmd)
+ return err
+ ]]
+ matches("Invalid argument : '%+%+ff=invalid'$", result)
+
+ -- Test incorrect ++ syntax
+ result = exec_lua [[
+ local cmd = vim.api.nvim_parse_cmd('edit ++unknown=test_unknown.txt', {})
+ local _, err = pcall(vim.cmd, cmd)
+ return err
+ ]]
+ matches("Invalid argument : '%+%+unknown=test_unknown.txt'$", result)
+
+ -- Test invalid ++bin flag
+ result = exec_lua [[
+ local cmd = vim.api.nvim_parse_cmd('edit ++binabc test_invalid_bin.txt', {})
+ local _, err = pcall(vim.cmd, cmd)
+ return err
+ ]]
+ matches("Invalid argument : '%+%+binabc test_invalid_bin.txt'$", result)
+ end)
+
+ it('handles ++p for creating parent directory', function()
+ exec_lua [[
+ vim.cmd('edit flags_dir/test_create.txt')
+ vim.cmd(vim.api.nvim_parse_cmd('write! ++p', {}))
+ ]]
+ eq(true, fn.isdirectory('flags_dir') == 1)
+ fn.delete('flags_dir', 'rf')
+ end)
+
+ it('tests editing files with bad utf8 sequences', function()
+ -- Write a file with bad utf8 sequences
+ local file = io.open('Xfile', 'wb')
+ file:write('[\255][\192][\226\137\240][\194\194]')
+ file:close()
+
+ exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit! ++enc=utf8 Xfile', {}))
+ ]])
+ eq('[?][?][???][??]', api.nvim_get_current_line())
+
+ exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit! ++enc=utf8 ++bad=_ Xfile', {}))
+ ]])
+ eq('[_][_][___][__]', api.nvim_get_current_line())
+
+ exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit! ++enc=utf8 ++bad=drop Xfile', {}))
+ ]])
+ eq('[][][][]', api.nvim_get_current_line())
+
+ exec_lua([[
+ vim.cmd(vim.api.nvim_parse_cmd('edit! ++enc=utf8 ++bad=keep Xfile', {}))
+ ]])
+ eq('[\255][\192][\226\137\240][\194\194]', api.nvim_get_current_line())
+
+ local result = exec_lua([[
+ local _, err = pcall(vim.cmd, vim.api.nvim_parse_cmd('edit ++enc=utf8 ++bad=foo Xfile', {}))
+ return err
+ ]])
+ matches("Invalid argument : '%+%+bad=foo'$", result)
+ -- Clean up
+ os.remove('Xfile')
+ end)
end)
it('nvim__redraw', function()