diff options
48 files changed, 1034 insertions, 675 deletions
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2acd615da1..d7f9556028 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,9 +12,10 @@ on: tags: - v[0-9]+.[0-9]+.[0-9]+ +# Build on the oldest supported images, so we have broader compatibility jobs: linux: - runs-on: ubuntu-20.04 + runs-on: ubuntu-16.04 outputs: version: ${{ steps.build.outputs.version }} release: ${{ steps.build.outputs.release }} @@ -42,7 +43,6 @@ jobs: retention-days: 1 appimage: - # Build on the oldest supported image, so we have broader compatibility runs-on: ubuntu-16.04 steps: - uses: actions/checkout@v2 diff --git a/CMakeLists.txt b/CMakeLists.txt index 78588fb3da..0b34639d32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -659,7 +659,7 @@ endif() if(LUACHECK_PRG) add_custom_target(lualint - COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/ + COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/ --exclude-files test/functional/fixtures/lua/syntax_error.lua WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) else() add_custom_target(lualint false diff --git a/contrib/flake.nix b/contrib/flake.nix new file mode 100644 index 0000000000..a75e584075 --- /dev/null +++ b/contrib/flake.nix @@ -0,0 +1,95 @@ +{ + description = "Neovim flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs }: let + system = "x86_64-linux"; + legacyPkgs = nixpkgs.legacyPackages."${system}".pkgs; + pkgs = legacyPkgs; + in { + + packages."${system}" = rec { + + neovim = legacyPkgs.neovim-unwrapped.overrideAttrs(oa: { + version = "master"; + src = ../.; + + buildInputs = oa.buildInputs ++ ([ + pkgs.tree-sitter + ]); + + cmakeFlags = oa.cmakeFlags ++ [ + "-DUSE_BUNDLED=OFF" + ]; + }); + + # a development binary to help debug issues + neovim-debug = (neovim.override { + stdenv = pkgs.llvmPackages_latest.stdenv; + lua = pkgs.enableDebugging legacyPkgs.luajit; + }).overrideAttrs(oa:{ + cmakeBuildType="Debug"; + cmakeFlags = oa.cmakeFlags ++ [ + "-DMIN_LOG_LEVEL=0" + ]; + }); + + # for neovim developers, very slow + # brings development tools as well + neovim-developer = let + lib = nixpkgs.lib; + pythonEnv = legacyPkgs.python3; + luacheck = legacyPkgs.luaPackages.luacheck; + in + neovim-debug.overrideAttrs(oa: { + cmakeFlags = oa.cmakeFlags ++ [ + "-DLUACHECK_PRG=${luacheck}/bin/luacheck" + "-DMIN_LOG_LEVEL=0" + "-DENABLE_LTO=OFF" + "-DUSE_BUNDLED=OFF" + # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags + # https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports + "-DCLANG_ASAN_UBSAN=ON" + ]; + + nativeBuildInputs = oa.nativeBuildInputs ++ (with pkgs; [ + pythonEnv + include-what-you-use # for scripts/check-includes.py + jq # jq for scripts/vim-patch.sh -r + doxygen + ]); + + shellHook = oa.shellHook + '' + export NVIM_PYTHON_LOG_LEVEL=DEBUG + export NVIM_LOG_FILE=/tmp/nvim.log + + export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1" + export UBSAN_OPTIONS=print_stacktrace=1 + ''; + }); + }; + + defaultPackage."${system}" = self.packages."${system}".neovim; + + overlay = final: prev: { + inherit (self.packages."${system}") neovim neovim-debug; + }; + + apps."${system}" = let + mkApp = pkg: { + type = "app"; + program = pkg + "/bin/nvim"; + }; + in { + nvim = mkApp self.packages."${system}".neovim; + nvim-debug = mkApp self.packages."${system}".neovim-debug; + }; + + defaultApp."${system}" = self.apps."${system}".nvim; + + devShell."${system}" = self.packages."${system}".neovim-developer; + }; +} diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index f306806c96..d04f52de0b 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -9331,6 +9331,13 @@ wincol() The result is a Number, which is the virtual column of the cursor in the window. This is counting screen cells from the left side of the window. The leftmost column is one. + *windowsversion()* +windowsversion() + The result is a String. For MS-Windows it indicates the OS + version. E.g, Windows 10 is "10.0", Windows 8 is "6.2", + Windows XP is "5.1". For non-MS-Windows systems the result is + an empty string. + winheight({nr}) *winheight()* The result is a Number, which is the height of window {nr}. {nr} can be the window number or the |window-ID|. diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt index c8a44dfb75..ea9072841c 100644 --- a/runtime/doc/lsp.txt +++ b/runtime/doc/lsp.txt @@ -247,7 +247,7 @@ For |lsp-notification|, each |lsp-handler| has this signature: > of a particular handler. For an example, see: - |vim.lsp.diagnostics.on_publish_diagnostics()| + |vim.lsp.diagnostic.on_publish_diagnostics()| To configure a particular |lsp-handler|, see: |lsp-handler-configuration| @@ -715,6 +715,15 @@ start_client({config}) *vim.lsp.start_client()* The following parameters describe fields in the {config} table. +> + + -- In attach function for the client, you can do: + local custom_attach = function(client) + if client.config.flags then + client.config.flags.allow_incremental_sync = true + end + end +< Parameters: ~ {root_dir} (required, string) Directory where the @@ -796,6 +805,11 @@ start_client({config}) *vim.lsp.start_client()* in the initialize request. Invalid/empty values will default to "off" + {flags} A table with flags for the client. The + current (experimental) flags are: + • allow_incremental_sync (bool, default + false): Allow using on_line callbacks + for lsp Return: ~ Client id. |vim.lsp.get_client_by_id()| Note: client may @@ -833,6 +847,12 @@ with({handler}, {override_config}) *vim.lsp.with()* ============================================================================== Lua module: vim.lsp.buf *lsp-buf* + *vim.lsp.buf.add_workspace_folder()* +add_workspace_folder({workspace_folder}) + Add the folder at path to the workspace folders. If {path} is + not provided, the user will be prompted for a path using + |input()|. + clear_references() *vim.lsp.buf.clear_references()* Removes document highlights from current buffer. @@ -935,6 +955,9 @@ incoming_calls() *vim.lsp.buf.incoming_calls()* |quickfix| window. If the symbol can resolve to multiple items, the user can pick one in the |inputlist|. +list_workspace_folders() *vim.lsp.buf.list_workspace_folders()* + List workspace folders. + outgoing_calls() *vim.lsp.buf.outgoing_calls()* Lists all the items that are called by the symbol under the cursor in the |quickfix| window. If the symbol can resolve to @@ -961,6 +984,9 @@ range_formatting({options}, {start_pos}, {end_pos}) Parameters: ~ {options} Table with valid `FormattingOptions` entries. {start_pos} ({number, number}, optional) mark-indexed + position. Defaults to the start of the last + visual selection. + {end_pos} ({number, number}, optional) mark-indexed position. Defaults to the end of the last visual selection. @@ -974,6 +1000,12 @@ references({context}) *vim.lsp.buf.references()* See also: ~ https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references + *vim.lsp.buf.remove_workspace_folder()* +remove_workspace_folder({workspace_folder}) + Remove the folder at path from the workspace folders. If + {path} is not provided, the user will be prompted for a path + using |input()|. + rename({new_name}) *vim.lsp.buf.rename()* Renames all references to the symbol under the cursor. @@ -996,19 +1028,6 @@ type_definition() *vim.lsp.buf.type_definition()* Jumps to the definition of the type of the symbol under the cursor. -add_workspace_folder({path}) *vim.lsp.buf.add_workspace_folder()* - Add the folder at path to the workspace folders. If {path} is - not provided, the user will be prompted for a path using - |input()|. - -remove_workspace_folder({path}) *vim.lsp.buf.remove_workspace_folder()* - Remove the folder at path from the workspace folders. If - {path} is not provided, the user will be prompted for - a path using |input()|. - -list_workspace_folders() *vim.lsp.buf.list_workspace_folders()* - List all folders in the workspace. - workspace_symbol({query}) *vim.lsp.buf.workspace_symbol()* Lists all symbols in the current workspace in the quickfix window. @@ -1062,9 +1081,9 @@ get_count({bufnr}, {severity}, {client_id}) let sl = '' if luaeval('not vim.tbl_isempty(vim.lsp.buf_get_clients(0))') let sl.='%#MyStatuslineLSP#E:' - let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count(vim.fn.bufnr('%'), [[Error]])")}' + let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count(0, [[Error]])")}' let sl.='%#MyStatuslineLSP# W:' - let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count(vim.fn.bufnr('%'), [[Warning]])")}' + let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count(0, [[Warning]])")}' else let sl.='%#MyStatuslineLSPErrors#off' endif @@ -1104,7 +1123,7 @@ get_next({opts}) *vim.lsp.diagnostic.get_next()* Get the previous diagnostic closest to the cursor_position Parameters: ~ - {opts} table See |vim.lsp.diagnostics.goto_next()| + {opts} table See |vim.lsp.diagnostic.goto_next()| Return: ~ table Next diagnostic @@ -1114,7 +1133,7 @@ get_next_pos({opts}) *vim.lsp.diagnostic.get_next_pos()* current buffer. Parameters: ~ - {opts} table See |vim.lsp.diagnostics.goto_next()| + {opts} table See |vim.lsp.diagnostic.goto_next()| Return: ~ table Next diagnostic position @@ -1123,7 +1142,7 @@ get_prev({opts}) *vim.lsp.diagnostic.get_prev()* Get the previous diagnostic closest to the cursor_position Parameters: ~ - {opts} table See |vim.lsp.diagnostics.goto_next()| + {opts} table See |vim.lsp.diagnostic.goto_next()| Return: ~ table Previous diagnostic @@ -1133,7 +1152,7 @@ get_prev_pos({opts}) *vim.lsp.diagnostic.get_prev_pos()* current buffer. Parameters: ~ - {opts} table See |vim.lsp.diagnostics.goto_next()| + {opts} table See |vim.lsp.diagnostic.goto_next()| Return: ~ table Previous diagnostic position @@ -1196,7 +1215,7 @@ goto_prev({opts}) *vim.lsp.diagnostic.goto_prev()* Move to the previous diagnostic Parameters: ~ - {opts} table See |vim.lsp.diagnostics.goto_next()| + {opts} table See |vim.lsp.diagnostic.goto_next()| *vim.lsp.diagnostic.on_publish_diagnostics()* on_publish_diagnostics({_}, {_}, {params}, {client_id}, {_}, {config}) @@ -1654,6 +1673,14 @@ make_text_document_params() *vim.lsp.util.make_text_document_params()* See also: ~ https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocumentIdentifier + *vim.lsp.util.make_workspace_params()* +make_workspace_params({added}, {removed}) + Create the workspace params + + Parameters: ~ + {added} + {removed} + *vim.lsp.util.open_floating_preview()* open_floating_preview({contents}, {filetype}, {opts}) Shows contents in a floating window. diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index f082fe29f2..ed31572abb 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -1,3 +1,5 @@ +local if_nil = vim.F.if_nil + local default_handlers = require 'vim.lsp.handlers' local log = require 'vim.lsp.log' local lsp_rpc = require 'vim.lsp.rpc' @@ -226,6 +228,7 @@ local function validate_client_config(config) on_init = { config.on_init, "f", true }; before_init = { config.before_init, "f", true }; offset_encoding = { config.offset_encoding, "s", true }; + flags = { config.flags, "t", true }; } -- TODO(remove-callbacks) @@ -434,6 +437,17 @@ end --- --@param trace: "off" | "messages" | "verbose" | nil passed directly to the language --- server in the initialize request. Invalid/empty values will default to "off" +--@param flags: A table with flags for the client. The current (experimental) flags are: +--- - allow_incremental_sync (bool, default false): Allow using on_line callbacks for lsp +--- +--- <pre> +--- -- In attach function for the client, you can do: +--- local custom_attach = function(client) +--- if client.config.flags then +--- client.config.flags.allow_incremental_sync = true +--- end +--- end +--- </pre> --- --@returns Client id. |vim.lsp.get_client_by_id()| Note: client may not be --- fully initialized. Use `on_init` to do any actions once @@ -442,6 +456,8 @@ function lsp.start_client(config) local cleaned_config = validate_client_config(config) local cmd, cmd_args, offset_encoding = cleaned_config.cmd, cleaned_config.cmd_args, cleaned_config.offset_encoding + config.flags = config.flags or {} + local client_id = next_client_id() -- TODO(remove-callbacks) @@ -799,6 +815,7 @@ do local size_index = encoding_index[client.offset_encoding] local length = select(size_index, old_byte_size, old_utf16_size, old_utf32_size) local lines = nvim_buf_get_lines(bufnr, firstline, new_lastline, true) + -- This is necessary because we are specifying the full line including the -- newline in range. Therefore, we must replace the newline as well. if #lines > 0 then @@ -820,6 +837,8 @@ do end) local uri = vim.uri_from_bufnr(bufnr) for_each_buffer_client(bufnr, function(client, _client_id) + local allow_incremental_sync = if_nil(client.config.flags.allow_incremental_sync, false) + local text_document_did_change = client.resolved_capabilities.text_document_did_change local changes if text_document_did_change == protocol.TextDocumentSyncKind.None then @@ -830,7 +849,7 @@ do -- is no way to specify the sync capability by the client. -- See https://github.com/palantir/python-language-server/commit/cfd6675bc10d5e8dbc50fc50f90e4a37b7178821#diff-f68667852a14e9f761f6ebf07ba02fc8 for an example of pyls handling both. --]=] - elseif true or text_document_did_change == protocol.TextDocumentSyncKind.Full then + elseif not allow_incremental_sync or text_document_did_change == protocol.TextDocumentSyncKind.Full then changes = full_changes(client) elseif text_document_did_change == protocol.TextDocumentSyncKind.Incremental then changes = incremental_changes(client) diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua index a70581478b..00219b6d98 100644 --- a/runtime/lua/vim/lsp/buf.lua +++ b/runtime/lua/vim/lsp/buf.lua @@ -149,7 +149,7 @@ end --@param options Table with valid `FormattingOptions` entries. --@param start_pos ({number, number}, optional) mark-indexed position. ---Defaults to the start of the last visual selection. ---@param start_pos ({number, number}, optional) mark-indexed position. +--@param end_pos ({number, number}, optional) mark-indexed position. ---Defaults to the end of the last visual selection. function M.range_formatting(options, start_pos, end_pos) validate { options = {options, 't', true} } @@ -239,6 +239,7 @@ function M.outgoing_calls() end --- List workspace folders. +--- function M.list_workspace_folders() local workspace_folders = {} for _, client in ipairs(vim.lsp.buf_get_clients()) do @@ -249,7 +250,8 @@ function M.list_workspace_folders() return workspace_folders end ---- Add a workspace folder. +--- Add the folder at path to the workspace folders. If {path} is +--- not provided, the user will be prompted for a path using |input()|. function M.add_workspace_folder(workspace_folder) workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h')) vim.api.nvim_command("redraw") @@ -275,7 +277,9 @@ function M.add_workspace_folder(workspace_folder) end end ---- Remove a workspace folder. +--- Remove the folder at path from the workspace folders. If +--- {path} is not provided, the user will be prompted for +--- a path using |input()|. function M.remove_workspace_folder(workspace_folder) workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h')) vim.api.nvim_command("redraw") diff --git a/runtime/lua/vim/lsp/diagnostic.lua b/runtime/lua/vim/lsp/diagnostic.lua index 27a1f53f89..efca5b53af 100644 --- a/runtime/lua/vim/lsp/diagnostic.lua +++ b/runtime/lua/vim/lsp/diagnostic.lua @@ -400,9 +400,9 @@ end --- let sl = '' --- if luaeval('not vim.tbl_isempty(vim.lsp.buf_get_clients(0))') --- let sl.='%#MyStatuslineLSP#E:' ---- let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count([[Error]])")}' +--- let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count(0, [[Error]])")}' --- let sl.='%#MyStatuslineLSP# W:' ---- let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count([[Warning]])")}' +--- let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count(0, [[Warning]])")}' --- else --- let sl.='%#MyStatuslineLSPErrors#off' --- endif @@ -510,7 +510,7 @@ end --- Get the previous diagnostic closest to the cursor_position --- ----@param opts table See |vim.lsp.diagnostics.goto_next()| +---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Previous diagnostic function M.get_prev(opts) opts = opts or {} @@ -523,7 +523,7 @@ function M.get_prev(opts) end --- Return the pos, {row, col}, for the prev diagnostic in the current buffer. ----@param opts table See |vim.lsp.diagnostics.goto_next()| +---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Previous diagnostic position function M.get_prev_pos(opts) return _iter_diagnostic_lines_pos( @@ -533,7 +533,7 @@ function M.get_prev_pos(opts) end --- Move to the previous diagnostic ----@param opts table See |vim.lsp.diagnostics.goto_next()| +---@param opts table See |vim.lsp.diagnostic.goto_next()| function M.goto_prev(opts) return _iter_diagnostic_move_pos( "DiagnosticPrevious", @@ -543,7 +543,7 @@ function M.goto_prev(opts) end --- Get the previous diagnostic closest to the cursor_position ----@param opts table See |vim.lsp.diagnostics.goto_next()| +---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Next diagnostic function M.get_next(opts) opts = opts or {} @@ -556,7 +556,7 @@ function M.get_next(opts) end --- Return the pos, {row, col}, for the next diagnostic in the current buffer. ----@param opts table See |vim.lsp.diagnostics.goto_next()| +---@param opts table See |vim.lsp.diagnostic.goto_next()| ---@return table Next diagnostic position function M.get_next_pos(opts) return _iter_diagnostic_lines_pos( diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index 5804ac6656..3da4dd6219 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1022,7 +1022,7 @@ do --@deprecated function M.buf_diagnostics_signs(bufnr, diagnostics, client_id) - warn_once("buf_diagnostics_signs is deprecated. Use 'vim.lsp.diagnostics.set_signs'") + warn_once("buf_diagnostics_signs is deprecated. Use 'vim.lsp.diagnostic.set_signs'") return vim.lsp.diagnostic.set_signs(diagnostics, bufnr, client_id) end @@ -1315,6 +1315,9 @@ function M.make_text_document_params() return { uri = vim.uri_from_bufnr(0) } end +--- Create the workspace params +--@param added +--@param removed function M.make_workspace_params(added, removed) return { event = { added = added; removed = removed; } } end diff --git a/runtime/lua/vim/treesitter/language.lua b/runtime/lua/vim/treesitter/language.lua index a7e36a0b89..d60cd2d0c7 100644 --- a/runtime/lua/vim/treesitter/language.lua +++ b/runtime/lua/vim/treesitter/language.lua @@ -8,7 +8,8 @@ local M = {} -- -- @param lang The language the parser should parse -- @param path Optionnal path the parser is located at -function M.require_language(lang, path) +-- @param silent Don't throw an error if language not found +function M.require_language(lang, path, silent) if vim._ts_has_language(lang) then return true end @@ -16,12 +17,23 @@ function M.require_language(lang, path) local fname = 'parser/' .. lang .. '.*' local paths = a.nvim_get_runtime_file(fname, false) if #paths == 0 then + if silent then + return false + end + -- TODO(bfredl): help tag? error("no parser for '"..lang.."' language, see :help treesitter-parsers") end path = paths[1] end - vim._ts_add_language(path, lang) + + if silent then + return pcall(function() vim._ts_add_language(path, lang) end) + else + vim._ts_add_language(path, lang) + end + + return true end --- Inspects the provided language. diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index 885460c9fd..04b5fee256 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -121,23 +121,30 @@ function LanguageTree:parse() local seen_langs = {} for lang, injection_ranges in pairs(injections_by_lang) do - local child = self._children[lang] + local has_lang = language.require_language(lang, nil, true) - if not child then - child = self:add_child(lang) - end + -- Child language trees should just be ignored if not found, since + -- they can depend on the text of a node. Intermediate strings + -- would cause errors for unknown parsers. + if has_lang then + local child = self._children[lang] - child:set_included_regions(injection_ranges) + if not child then + child = self:add_child(lang) + end - local _, child_changes = child:parse() + child:set_included_regions(injection_ranges) - -- Propagate any child changes so they are included in the - -- the change list for the callback. - if child_changes then - vim.list_extend(changes, child_changes) - end + local _, child_changes = child:parse() - seen_langs[lang] = true + -- Propagate any child changes so they are included in the + -- the change list for the callback. + if child_changes then + vim.list_extend(changes, child_changes) + end + + seen_langs[lang] = true + end end for lang, _ in pairs(self._children) do diff --git a/src/nvim/charset.c b/src/nvim/charset.c index fb158f377a..3e52b3e3ce 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -45,8 +45,6 @@ static bool chartab_initialized = false; (buf)->b_chartab[(unsigned)(c) >> 6] &= ~(1ull << ((c) & 0x3f)) #define GET_CHARTAB_TAB(chartab, c) \ ((chartab)[(unsigned)(c) >> 6] & (1ull << ((c) & 0x3f))) -#define GET_CHARTAB(buf, c) \ - GET_CHARTAB_TAB((buf)->b_chartab, c) // Table used below, see init_chartab() for an explanation static char_u g_chartab[256]; diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index 9f1994e299..466f1800c7 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -392,6 +392,7 @@ return { win_screenpos={args=1}, winbufnr={args=1}, wincol={}, + windowsversion={}, winheight={args=1}, winlayout={args={0, 1}}, winline={}, diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 4df935469a..b56034b92d 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -95,7 +95,6 @@ PRAGMA_DIAG_POP static char *e_listarg = N_("E686: Argument of %s must be a List"); -static char *e_stringreq = N_("E928: String required"); static char *e_invalwindow = N_("E957: Invalid window number"); /// Dummy va_list for passing to vim_snprintf @@ -1877,10 +1876,12 @@ static void f_eventhandler(typval_T *argvars, typval_T *rettv, FunPtr fptr) */ static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - const char *name = tv_get_string(&argvars[0]); + if (tv_check_for_string(&argvars[0]) == FAIL) { + return; + } // Check in $PATH and also check directly if there is a directory name - rettv->vval.v_number = os_can_exe(name, NULL, true); + rettv->vval.v_number = os_can_exe(tv_get_string(&argvars[0]), NULL, true); } typedef struct { @@ -1984,10 +1985,13 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "exepath()" function static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - const char *arg = tv_get_string(&argvars[0]); + if (tv_check_for_string(&argvars[0]) == FAIL) { + return; + } + char *path = NULL; - (void)os_can_exe(arg, &path, true); + (void)os_can_exe(tv_get_string(&argvars[0]), &path, true); rettv->v_type = VAR_STRING; rettv->vval.v_string = (char_u *)path; @@ -11213,6 +11217,13 @@ static void f_winwidth(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } +// "windowsversion()" function +static void f_windowsversion(typval_T *argvars, typval_T *rettv, FunPtr fptr) +{ + rettv->v_type = VAR_STRING; + rettv->vval.v_string = (char_u *)xstrdup(windowsVersion); +} + /// "wordcount()" function static void f_wordcount(typval_T *argvars, typval_T *rettv, FunPtr fptr) { diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c index b62820fecc..02d32a4f86 100644 --- a/src/nvim/eval/typval.c +++ b/src/nvim/eval/typval.c @@ -2953,6 +2953,19 @@ float_T tv_get_float(const typval_T *const tv) return 0; } +// Give an error and return FAIL unless "tv" is a non-empty string. +int tv_check_for_string(const typval_T *const tv) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE +{ + if (tv->v_type != VAR_STRING + || tv->vval.v_string == NULL + || *tv->vval.v_string == NUL) { + EMSG(_(e_stringreq)); + return FAIL; + } + return OK; +} + /// Get the string value of a "stringish" VimL object. /// /// @param[in] tv Object to get value of. diff --git a/src/nvim/ex_cmds.lua b/src/nvim/ex_cmds.lua index d62b00fee1..380237c822 100644 --- a/src/nvim/ex_cmds.lua +++ b/src/nvim/ex_cmds.lua @@ -29,394 +29,384 @@ local FILES = bit.bor(XFILE, EXTRA) local WORD1 = bit.bor(EXTRA, NOSPC) local FILE1 = bit.bor(FILES, NOSPC) -local ADDR_LINES = 0 -- buffer line numbers -local ADDR_WINDOWS = 1 -- window number -local ADDR_ARGUMENTS = 2 -- argument number -local ADDR_LOADED_BUFFERS = 3 -- buffer number of loaded buffer -local ADDR_BUFFERS = 4 -- buffer number -local ADDR_TABS = 5 -- tab page number -local ADDR_TABS_RELATIVE = 6 -- Tab page that only relative -local ADDR_QUICKFIX = 7 -- quickfix list entry number -local ADDR_OTHER = 99 -- something else - -- The following table is described in ex_cmds_defs.h file. return { { command='append', flags=bit.bor(BANG, RANGE, ZEROR, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_append', }, { command='abbreviate', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='abclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abclear', }, { command='aboveleft', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='all', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_all', }, { command='amenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='anoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='args', flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_args', }, { command='argadd', flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, FILES, TRLBAR), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_argadd', }, { command='argdelete', flags=bit.bor(BANG, RANGE, NOTADR, FILES, TRLBAR), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_argdelete', }, { command='argdo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_listdo', }, { command='argedit', flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_argedit', }, { command='argglobal', flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_args', }, { command='arglocal', flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_args', }, { command='argument', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_argument', }, { command='ascii', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='do_ascii', }, { command='autocmd', flags=bit.bor(BANG, EXTRA, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_autocmd', }, { command='augroup', flags=bit.bor(BANG, WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_autocmd', }, { command='aunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='buffer', flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR), - addr_type=ADDR_BUFFERS, + addr_type='ADDR_BUFFERS', func='ex_buffer', }, { command='bNext', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bprevious', }, { command='ball', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_buffer_all', }, { command='badd', flags=bit.bor(NEEDARG, FILE1, EDITCMD, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='bdelete', flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR), - addr_type=ADDR_BUFFERS, + addr_type='ADDR_BUFFERS', func='ex_bunload', }, { command='behave', flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_behave', }, { command='belowright', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='bfirst', flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_brewind', }, { command='blast', flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_blast', }, { command='bmodified', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bmodified', }, { command='bnext', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bnext', }, { command='botright', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='bprevious', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bprevious', }, { command='brewind', flags=bit.bor(BANG, RANGE, NOTADR, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_brewind', }, { command='break', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_break', }, { command='breakadd', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_breakadd', }, { command='breakdel', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_breakdel', }, { command='breaklist', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_breaklist', }, { command='browse', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='buffers', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='buflist_list', }, { command='bufdo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_BUFFERS, + addr_type='ADDR_BUFFERS', func='ex_listdo', }, { command='bunload', flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR), - addr_type=ADDR_LOADED_BUFFERS, + addr_type='ADDR_LOADED_BUFFERS', func='ex_bunload', }, { command='bwipeout', flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, TRLBAR), - addr_type=ADDR_BUFFERS, + addr_type='ADDR_BUFFERS', func='ex_bunload', }, { command='change', flags=bit.bor(BANG, WHOLEFOLD, RANGE, COUNT, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_change', }, { command='cNext', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cNfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='cabclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abclear', }, { command='cabove', flags=bit.bor(RANGE, TRLBAR), - addr_type=ADDR_OTHER , + addr_type='ADDR_OTHER ', func='ex_cbelow', }, { command='caddbuffer', flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='caddexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='caddfile', flags=bit.bor(TRLBAR, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, { command='call', flags=bit.bor(RANGE, NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_call', }, { command='catch', flags=bit.bor(EXTRA, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_catch', }, { command='cbuffer', flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='cbelow', flags=bit.bor(RANGE, TRLBAR), - addr_type=ADDR_OTHER , + addr_type='ADDR_OTHER ', func='ex_cbelow', }, { command='cbottom', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbottom', }, { command='cc', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='cclose', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cclose', }, { command='cd', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='cdo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_QUICKFIX, + addr_type='ADDR_QUICKFIX', func='ex_listdo', }, { command='center', flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_align', }, { command='cexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='cfile', flags=bit.bor(TRLBAR, FILE1, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, -- Even though 'cfdo' is alphabetically lower than 'cfile', it is after @@ -424,979 +414,979 @@ return { { command='cfdo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_QUICKFIX, + addr_type='ADDR_QUICKFIX', func='ex_listdo', }, { command='cfirst', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='cgetfile', flags=bit.bor(TRLBAR, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, { command='cgetbuffer', flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='cgetexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='chdir', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='changes', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_changes', }, { command='checkhealth', flags=bit.bor(EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_checkhealth', }, { command='checkpath', flags=bit.bor(TRLBAR, BANG, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_checkpath', }, { command='checktime', flags=bit.bor(RANGE, NOTADR, BUFNAME, COUNT, EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_checktime', }, { command='chistory', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_history', }, { command='clist', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_list', }, { command='clast', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='close', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_close', }, { command='clearjumps', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_clearjumps', }, { command='cmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='cmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='cmenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='cnext', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cnewer', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_age', }, { command='cnfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='cnoreabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='cnoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='copy', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_copymove', }, { command='colder', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_age', }, { command='colorscheme', flags=bit.bor(WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_colorscheme', }, { command='command', flags=bit.bor(EXTRA, BANG, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_command', }, { command='comclear', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_comclear', }, { command='compiler', flags=bit.bor(BANG, TRLBAR, WORD1, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_compiler', }, { command='continue', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_continue', }, { command='confirm', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='const', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_const', }, { command='copen', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_copen', }, { command='cprevious', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cpfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='cquit', flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cquit', }, { command='crewind', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='cscope', flags=bit.bor(EXTRA, NOTRLCOM, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cscope', }, { command='cstag', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cstag', }, { command='cunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='cunabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='cunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='cwindow', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cwindow', }, { command='delete', flags=bit.bor(RANGE, WHOLEFOLD, REGSTR, COUNT, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_operators', }, { command='delmarks', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_delmarks', }, { command='debug', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_debug', }, { command='debuggreedy', flags=bit.bor(RANGE, NOTADR, ZEROR, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_debuggreedy', }, { command='delcommand', flags=bit.bor(BANG, NEEDARG, WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_delcommand', }, { command='delfunction', flags=bit.bor(BANG, NEEDARG, WORD1, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_delfunction', }, { command='display', flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_display', }, { command='diffupdate', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffupdate', }, { command='diffget', flags=bit.bor(RANGE, EXTRA, TRLBAR, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffgetput', }, { command='diffoff', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffoff', }, { command='diffpatch', flags=bit.bor(EXTRA, FILE1, TRLBAR, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffpatch', }, { command='diffput', flags=bit.bor(RANGE, EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffgetput', }, { command='diffsplit', flags=bit.bor(EXTRA, FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffsplit', }, { command='diffthis', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_diffthis', }, { command='digraphs', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_digraphs', }, { command='djump', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='dlist', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='doautocmd', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_doautocmd', }, { command='doautoall', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_doautoall', }, { command='drop', flags=bit.bor(FILES, EDITCMD, NEEDARG, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_drop', }, { command='dsearch', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='dsplit', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='edit', flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='earlier', flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_later', }, { command='echo', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_echo', }, { command='echoerr', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_execute', }, { command='echohl', flags=bit.bor(EXTRA, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_echohl', }, { command='echomsg', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_execute', }, { command='echon', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_echo', }, { command='else', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_else', }, { command='elseif', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_else', }, { command='emenu', flags=bit.bor(NEEDARG, EXTRA, TRLBAR, NOTRLCOM, RANGE, NOTADR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_emenu', }, { command='endif', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_endif', }, { command='endfunction', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_endfunction', }, { command='endfor', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_endwhile', }, { command='endtry', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_endtry', }, { command='endwhile', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_endwhile', }, { command='enew', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='ex', flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='execute', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_execute', }, { command='exit', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_exit', }, { command='exusage', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_exusage', }, { command='file', flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_file', }, { command='files', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='buflist_list', }, { command='filetype', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_filetype', }, { command='filter', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='find', flags=bit.bor(RANGE, NOTADR, BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_find', }, { command='finally', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_finally', }, { command='finish', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_finish', }, { command='first', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rewind', }, { command='fold', flags=bit.bor(RANGE, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_fold', }, { command='foldclose', flags=bit.bor(RANGE, BANG, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_foldopen', }, { command='folddoopen', flags=bit.bor(RANGE, DFLALL, NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_folddo', }, { command='folddoclosed', flags=bit.bor(RANGE, DFLALL, NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_folddo', }, { command='foldopen', flags=bit.bor(RANGE, BANG, WHOLEFOLD, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_foldopen', }, { command='for', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_while', }, { command='function', flags=bit.bor(EXTRA, BANG, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_function', }, { command='global', flags=bit.bor(RANGE, WHOLEFOLD, BANG, EXTRA, DFLALL, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_global', }, { command='goto', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_goto', }, { command='grep', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='grepadd', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='gui', flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_nogui', }, { command='gvim', flags=bit.bor(BANG, FILES, EDITCMD, ARGOPT, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_nogui', }, { command='help', flags=bit.bor(BANG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_help', }, { command='helpclose', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_helpclose', }, { command='helpgrep', flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_helpgrep', }, { command='helptags', flags=bit.bor(NEEDARG, FILES, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_helptags', }, { command='hardcopy', flags=bit.bor(RANGE, COUNT, EXTRA, TRLBAR, DFLALL, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_hardcopy', }, { command='highlight', flags=bit.bor(BANG, EXTRA, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_highlight', }, { command='hide', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, TRLBAR), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_hide', }, { command='history', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_history', }, { command='insert', flags=bit.bor(BANG, RANGE, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_append', }, { command='iabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='iabclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abclear', }, { command='if', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_if', }, { command='ijump', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='ilist', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='imap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='imapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='imenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='inoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='inoreabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='inoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='intro', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_intro', }, { command='isearch', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='isplit', flags=bit.bor(BANG, RANGE, DFLALL, WHOLEFOLD, EXTRA), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_findpat', }, { command='iunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='iunabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='iunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='join', flags=bit.bor(BANG, RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_join', }, { command='jumps', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_jumps', }, { command='k', flags=bit.bor(RANGE, WORD1, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mark', }, { command='keepmarks', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='keepjumps', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='keeppatterns', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='keepalt', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='list', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_print', }, { command='lNext', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='lNfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='last', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_last', }, { command='labove', flags=bit.bor(RANGE, TRLBAR), - addr_type=ADDR_OTHER , + addr_type='ADDR_OTHER ', func='ex_cbelow', }, { command='language', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_language', }, { command='laddexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='laddbuffer', flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='laddfile', flags=bit.bor(TRLBAR, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, { command='later', flags=bit.bor(TRLBAR, EXTRA, NOSPC, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_later', }, { command='lbuffer', flags=bit.bor(BANG, RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='lbelow', flags=bit.bor(RANGE, TRLBAR), - addr_type=ADDR_OTHER , + addr_type='ADDR_OTHER ', func='ex_cbelow', }, { command='lbottom', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbottom', }, { command='lcd', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='lchdir', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='lclose', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cclose', }, { command='lcscope', flags=bit.bor(EXTRA, NOTRLCOM, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cscope', }, { command='ldo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_QUICKFIX, + addr_type='ADDR_QUICKFIX', func='ex_listdo', }, { command='left', flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_align', }, { command='leftabove', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='let', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_let', }, { command='lexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='lfile', flags=bit.bor(TRLBAR, FILE1, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, -- Even though 'lfdo' is alphabetically lower than 'lfile', it is after @@ -1404,1899 +1394,1899 @@ return { { command='lfdo', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_QUICKFIX, + addr_type='ADDR_QUICKFIX', func='ex_listdo', }, { command='lfirst', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='lgetfile', flags=bit.bor(TRLBAR, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cfile', }, { command='lgetbuffer', flags=bit.bor(RANGE, NOTADR, WORD1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cbuffer', }, { command='lgetexpr', flags=bit.bor(NEEDARG, WORD1, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cexpr', }, { command='lgrep', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='lgrepadd', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='lhelpgrep', flags=bit.bor(EXTRA, NOTRLCOM, NEEDARG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_helpgrep', }, { command='lhistory', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_history', }, { command='ll', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='llast', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='llist', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_list', }, { command='lmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='lmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='lmake', flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='lnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='lnext', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='lnewer', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_age', }, { command='lnfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='loadview', flags=bit.bor(FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_loadview', }, { command='loadkeymap', flags=bit.bor(CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_loadkeymap', }, { command='lockmarks', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='lockvar', flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_lockvar', }, { command='lolder', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='qf_age', }, { command='lopen', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_copen', }, { command='lprevious', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='lpfile', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cnext', }, { command='lrewind', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR, BANG), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cc', }, { command='ltag', flags=bit.bor(NOTADR, TRLBAR, BANG, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='lunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='lua', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_lua', }, { command='luado', flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_luado', }, { command='luafile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_luafile', }, { command='lvimgrep', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_vimgrep', }, { command='lvimgrepadd', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_vimgrep', }, { command='lwindow', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cwindow', }, { command='ls', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='buflist_list', }, { command='move', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_copymove', }, { command='mark', flags=bit.bor(RANGE, WORD1, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mark', }, { command='make', flags=bit.bor(BANG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_make', }, { command='map', flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='mapclear', flags=bit.bor(EXTRA, BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='marks', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_marks', }, { command='match', flags=bit.bor(RANGE, NOTADR, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_match', }, { command='menu', flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='menutranslate', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menutranslate', }, { command='messages', flags=bit.bor(EXTRA, TRLBAR, RANGE, CMDWIN), - addr_type=ADDR_OTHER, + addr_type='ADDR_OTHER', func='ex_messages', }, { command='mkexrc', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mkrc', }, { command='mksession', flags=bit.bor(BANG, FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mkrc', }, { command='mkspell', flags=bit.bor(BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mkspell', }, { command='mkvimrc', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mkrc', }, { command='mkview', flags=bit.bor(BANG, FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mkrc', }, { command='mode', flags=bit.bor(WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mode', }, { command='mzscheme', flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN, SBOXOK), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_script_ni', }, { command='mzfile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='next', flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_next', }, { command='new', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='nmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='nmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='nmenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='nnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='nnoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='noremap', flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='noautocmd', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='nohlsearch', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_nohlsearch', }, { command='noreabbrev', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='noremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='noswapfile', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='normal', flags=bit.bor(RANGE, BANG, EXTRA, NEEDARG, NOTRLCOM, USECTRLV, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_normal', }, { command='number', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_print', }, { command='nunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='nunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='oldfiles', flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_oldfiles', }, { command='omap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='omapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='omenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='only', flags=bit.bor(BANG, NOTADR, RANGE, COUNT, TRLBAR), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_only', }, { command='onoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='onoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='options', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_options', }, { command='ounmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='ounmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='ownsyntax', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ownsyntax', }, { command='print', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, SBOXOK), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_print', }, { command='packadd', flags=bit.bor(BANG, FILE1, NEEDARG, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_packadd', }, { command='packloadall', flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_packloadall', }, { command='pclose', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pclose', }, { command='perl', flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, SBOXOK, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_perl', }, { command='perldo', flags=bit.bor(RANGE, EXTRA, DFLALL, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_perldo', }, { command='perlfile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_perlfile', }, { command='pedit', flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pedit', }, { command='pop', flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='popup', flags=bit.bor(NEEDARG, EXTRA, BANG, TRLBAR, NOTRLCOM, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='ppop', flags=bit.bor(RANGE, NOTADR, BANG, COUNT, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='preserve', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_preserve', }, { command='previous', flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_previous', }, { command='profile', flags=bit.bor(BANG, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_profile', }, { command='profdel', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_breakdel', }, { command='psearch', flags=bit.bor(BANG, RANGE, WHOLEFOLD, DFLALL, EXTRA), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_psearch', }, { command='ptag', flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptNext', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptfirst', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptjump', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptlast', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptnext', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptprevious', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptrewind', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='ptselect', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ptag', }, { command='put', flags=bit.bor(RANGE, WHOLEFOLD, BANG, REGSTR, TRLBAR, ZEROR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_put', }, { command='pwd', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pwd', }, { command='python', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_python', }, { command='pydo', flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pydo', }, { command='pyfile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pyfile', }, { command='py3', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_python3', }, { command='py3do', flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pydo3', }, { command='python3', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_python3', }, { command='py3file', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_py3file', }, { command='pyx', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pyx', }, { command='pyxdo', flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pyxdo', }, { command='pythonx', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pyx', }, { command='pyxfile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_pyxfile', }, { command='quit', flags=bit.bor(BANG, RANGE, COUNT, NOTADR, TRLBAR, CMDWIN), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_quit', }, { command='quitall', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_quit_all', }, { command='qall', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_quit_all', }, { command='read', flags=bit.bor(BANG, RANGE, WHOLEFOLD, FILE1, ARGOPT, TRLBAR, ZEROR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_read', }, { command='recover', flags=bit.bor(BANG, FILE1, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_recover', }, { command='redo', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_redo', }, { command='redir', flags=bit.bor(BANG, FILES, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_redir', }, { command='redraw', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_redraw', }, { command='redrawstatus', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_redrawstatus', }, { command='redrawtabline', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_redrawtabline', }, { command='registers', flags=bit.bor(EXTRA, NOTRLCOM, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_display', }, { command='resize', flags=bit.bor(RANGE, NOTADR, TRLBAR, WORD1, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_resize', }, { command='retab', flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, DFLALL, BANG, WORD1, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_retab', }, { command='return', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_return', }, { command='rewind', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rewind', }, { command='right', flags=bit.bor(TRLBAR, RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_align', }, { command='rightbelow', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='rshada', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_shada', }, { command='runtime', flags=bit.bor(BANG, NEEDARG, FILES, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_runtime', }, { command='rundo', flags=bit.bor(NEEDARG, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rundo', }, { command='ruby', flags=bit.bor(RANGE, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ruby', }, { command='rubydo', flags=bit.bor(RANGE, DFLALL, EXTRA, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rubydo', }, { command='rubyfile', flags=bit.bor(RANGE, FILE1, NEEDARG, CMDWIN, RESTRICT), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rubyfile', }, { command='rviminfo', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_shada', }, { command='substitute', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_substitute', }, { command='sNext', flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_previous', }, { command='sargument', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, EXTRA, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_ARGUMENTS, + addr_type='ADDR_ARGUMENTS', func='ex_argument', }, { command='sall', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_all', }, { command='sandbox', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='saveas', flags=bit.bor(BANG, DFLALL, FILE1, ARGOPT, CMDWIN, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_write', }, { command='sbuffer', flags=bit.bor(BANG, RANGE, NOTADR, BUFNAME, BUFUNL, COUNT, EXTRA, EDITCMD, TRLBAR), - addr_type=ADDR_BUFFERS, + addr_type='ADDR_BUFFERS', func='ex_buffer', }, { command='sbNext', flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bprevious', }, { command='sball', flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_buffer_all', }, { command='sbfirst', flags=bit.bor(EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_brewind', }, { command='sblast', flags=bit.bor(EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_blast', }, { command='sbmodified', flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bmodified', }, { command='sbnext', flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bnext', }, { command='sbprevious', flags=bit.bor(RANGE, NOTADR, COUNT, EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bprevious', }, { command='sbrewind', flags=bit.bor(EDITCMD, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_brewind', }, { command='scriptnames', flags=bit.bor(BANG, RANGE, NOTADR, COUNT, TRLBAR, CMDWIN), - addr_type=ADDR_OTHER, + addr_type='ADDR_OTHER', func='ex_scriptnames', }, { command='scriptencoding', flags=bit.bor(WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_scriptencoding', }, { command='scscope', flags=bit.bor(EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_scscope', }, { command='set', flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_set', }, { command='setfiletype', flags=bit.bor(TRLBAR, EXTRA, NEEDARG, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_setfiletype', }, { command='setglobal', flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_set', }, { command='setlocal', flags=bit.bor(TRLBAR, EXTRA, CMDWIN, SBOXOK), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_set', }, { command='sfind', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='sfirst', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rewind', }, { command='simalt', flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='sign', flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_sign', }, { command='silent', flags=bit.bor(NEEDARG, EXTRA, BANG, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='sleep', flags=bit.bor(RANGE, NOTADR, COUNT, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_sleep', }, { command='slast', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_last', }, { command='smagic', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_submagic', }, { command='smap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='smapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='smenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='snext', flags=bit.bor(RANGE, NOTADR, BANG, FILES, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_next', }, { command='snomagic', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_submagic', }, { command='snoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='snoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='source', flags=bit.bor(BANG, FILE1, TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_source', }, { command='sort', flags=bit.bor(RANGE, DFLALL, WHOLEFOLD, BANG, EXTRA, NOTRLCOM, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_sort', }, { command='split', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='spellgood', flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spell', }, { command='spelldump', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spelldump', }, { command='spellinfo', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spellinfo', }, { command='spellrepall', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spellrepall', }, { command='spellundo', flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spell', }, { command='spellwrong', flags=bit.bor(BANG, RANGE, NOTADR, NEEDARG, EXTRA, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_spell', }, { command='sprevious', flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_previous', }, { command='srewind', flags=bit.bor(EXTRA, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_rewind', }, { command='stop', flags=bit.bor(TRLBAR, BANG, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stop', }, { command='stag', flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stag', }, { command='startinsert', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_startinsert', }, { command='startgreplace', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_startinsert', }, { command='startreplace', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_startinsert', }, { command='stopinsert', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stopinsert', }, { command='stjump', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stag', }, { command='stselect', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stag', }, { command='sunhide', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_buffer_all', }, { command='sunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='sunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='suspend', flags=bit.bor(TRLBAR, BANG, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_stop', }, { command='sview', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='swapname', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_swapname', }, { command='syntax', flags=bit.bor(EXTRA, NOTRLCOM, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_syntax', }, { command='syntime', flags=bit.bor(NEEDARG, WORD1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_syntime', }, { command='syncbind', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_syncbind', }, { command='t', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_copymove', }, { command='tcd', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='tchdir', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_cd', }, { command='tNext', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tag', flags=bit.bor(RANGE, NOTADR, BANG, WORD1, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tags', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='do_tags', }, { command='tab', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_wrongmodifier', }, { command='tabclose', flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabclose', }, { command='tabdo', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_listdo', }, { command='tabedit', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_splitview', }, { command='tabfind', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, NEEDARG, TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_splitview', }, { command='tabfirst', flags=bit.bor(TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabnext', }, { command='tabmove', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabmove', }, { command='tablast', flags=bit.bor(TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabnext', }, { command='tabnext', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabnext', }, { command='tabnew', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, ZEROR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_splitview', }, { command='tabonly', flags=bit.bor(BANG, RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR, CMDWIN), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabonly', }, { command='tabprevious', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR), - addr_type=ADDR_TABS_RELATIVE, + addr_type='ADDR_TABS_RELATIVE', func='ex_tabnext', }, { command='tabNext', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, NOSPC, TRLBAR), - addr_type=ADDR_TABS_RELATIVE, + addr_type='ADDR_TABS_RELATIVE', func='ex_tabnext', }, { command='tabrewind', flags=bit.bor(TRLBAR), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabnext', }, { command='tabs', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_TABS, + addr_type='ADDR_TABS', func='ex_tabs', }, { command='tcl', flags=bit.bor(RANGE,EXTRA,NEEDARG,CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_script_ni', }, { command='tcldo', flags=bit.bor(RANGE,DFLALL,EXTRA,NEEDARG,CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='tclfile', flags=bit.bor(RANGE,FILE1,NEEDARG,CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='terminal', flags=bit.bor(BANG, FILES, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_terminal', }, { command='tfirst', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='throw', flags=bit.bor(EXTRA, NEEDARG, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_throw', }, { command='tjump', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tlast', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tmenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='tmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='tmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='tnext', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='topleft', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='tprevious', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='trewind', flags=bit.bor(RANGE, NOTADR, BANG, TRLBAR, ZEROR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='try', flags=bit.bor(TRLBAR, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_try', }, { command='tselect', flags=bit.bor(BANG, TRLBAR, WORD1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_tag', }, { command='tunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='tunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='undo', flags=bit.bor(RANGE, NOTADR, COUNT, ZEROR, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_undo', }, { command='undojoin', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_undojoin', }, { command='undolist', flags=bit.bor(TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_undolist', }, { command='unabbreviate', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_abbreviate', }, { command='unhide', flags=bit.bor(RANGE, NOTADR, COUNT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_buffer_all', }, { command='unlet', flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unlet', }, { command='unlockvar', flags=bit.bor(BANG, EXTRA, NEEDARG, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_lockvar', }, { command='unmap', flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='unmenu', flags=bit.bor(BANG, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='unsilent', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='update', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_update', }, { command='vglobal', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, DFLALL, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_global', }, { command='version', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_version', }, { command='verbose', flags=bit.bor(NEEDARG, RANGE, NOTADR, EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='vertical', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wrongmodifier', }, { command='visual', flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='view', flags=bit.bor(BANG, FILE1, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_edit', }, { command='vimgrep', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_vimgrep', }, { command='vimgrepadd', flags=bit.bor(RANGE, NOTADR, BANG, NEEDARG, EXTRA, NOTRLCOM, TRLBAR, XFILE), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_vimgrep', }, { command='viusage', flags=bit.bor(TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_viusage', }, { command='vmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='vmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='vmenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='vnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='vnew', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='vnoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='vsplit', flags=bit.bor(BANG, FILE1, RANGE, NOTADR, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_splitview', }, { command='vunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='vunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='write', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_write', }, { command='wNext', flags=bit.bor(RANGE, WHOLEFOLD, NOTADR, BANG, FILE1, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wnext', }, { command='wall', flags=bit.bor(BANG, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='do_wqall', }, { command='while', flags=bit.bor(EXTRA, NOTRLCOM, SBOXOK, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_while', }, { command='winsize', flags=bit.bor(EXTRA, NEEDARG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_winsize', }, { command='wincmd', flags=bit.bor(NEEDARG, WORD1, RANGE, NOTADR, CMDWIN), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_wincmd', }, { command='windo', flags=bit.bor(NEEDARG, EXTRA, NOTRLCOM, RANGE, NOTADR, DFLALL), - addr_type=ADDR_WINDOWS, + addr_type='ADDR_WINDOWS', func='ex_listdo', }, { command='winpos', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_ni', }, { command='wnext', flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wnext', }, { command='wprevious', flags=bit.bor(RANGE, NOTADR, BANG, FILE1, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wnext', }, { command='wq', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_exit', }, { command='wqall', flags=bit.bor(BANG, FILE1, ARGOPT, DFLALL, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='do_wqall', }, { command='wshada', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_shada', }, { command='wundo', flags=bit.bor(BANG, NEEDARG, FILE1), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_wundo', }, { command='wviminfo', flags=bit.bor(BANG, FILE1, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_shada', }, { command='xit', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILE1, ARGOPT, DFLALL, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_exit', }, { command='xall', flags=bit.bor(BANG, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='do_wqall', }, { command='xmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='xmapclear', flags=bit.bor(EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_mapclear', }, { command='xmenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='xnoremap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_map', }, { command='xnoremenu', flags=bit.bor(RANGE, NOTADR, ZEROR, EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='xunmap', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_unmap', }, { command='xunmenu', flags=bit.bor(EXTRA, TRLBAR, NOTRLCOM, USECTRLV, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_menu', }, { command='yank', flags=bit.bor(RANGE, WHOLEFOLD, REGSTR, COUNT, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_operators', }, { command='z', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, EXFLAGS, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_z', }, { command='!', enum='CMD_bang', flags=bit.bor(RANGE, WHOLEFOLD, BANG, FILES, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_bang', }, { command='#', enum='CMD_pound', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_print', }, { command='&', enum='CMD_and', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_substitute', }, { command='<', enum='CMD_lshift', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_operators', }, { command='=', enum='CMD_equal', flags=bit.bor(RANGE, TRLBAR, DFLALL, EXFLAGS, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_equal', }, { command='>', enum='CMD_rshift', flags=bit.bor(RANGE, WHOLEFOLD, COUNT, EXFLAGS, TRLBAR, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_operators', }, { command='@', enum='CMD_at', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, TRLBAR, CMDWIN), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_at', }, { command='Next', flags=bit.bor(EXTRA, RANGE, NOTADR, COUNT, BANG, EDITCMD, ARGOPT, TRLBAR), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_previous', }, { command='~', enum='CMD_tilde', flags=bit.bor(RANGE, WHOLEFOLD, EXTRA, CMDWIN, MODIFY), - addr_type=ADDR_LINES, + addr_type='ADDR_LINES', func='ex_substitute', }, } diff --git a/src/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h index 21db3936b8..5613ae4b8c 100644 --- a/src/nvim/ex_cmds_defs.h +++ b/src/nvim/ex_cmds_defs.h @@ -67,15 +67,18 @@ #define FILE1 (FILES | NOSPC) // 1 file allowed, defaults to current file // values for cmd_addr_type -#define ADDR_LINES 0 -#define ADDR_WINDOWS 1 -#define ADDR_ARGUMENTS 2 -#define ADDR_LOADED_BUFFERS 3 -#define ADDR_BUFFERS 4 -#define ADDR_TABS 5 -#define ADDR_TABS_RELATIVE 6 // Tab page that only relative -#define ADDR_QUICKFIX 7 -#define ADDR_OTHER 99 +typedef enum { + ADDR_LINES, // buffer line numbers + ADDR_WINDOWS, // window number + ADDR_ARGUMENTS, // argument number + ADDR_LOADED_BUFFERS, // buffer number of loaded buffer + ADDR_BUFFERS, // buffer number + ADDR_TABS, // tab page number + ADDR_TABS_RELATIVE, // Tab page that only relative + ADDR_QUICKFIX, // quickfix list entry number + ADDR_OTHER, // something else + ADDR_NONE // no range used +} cmd_addr_T; typedef struct exarg exarg_T; @@ -93,7 +96,7 @@ typedef struct cmdname { char_u *cmd_name; ///< Name of the command. ex_func_T cmd_func; ///< Function with implementation of this command. uint32_t cmd_argt; ///< Relevant flags from the declared above. - int cmd_addr_type; ///< Flag for address type + cmd_addr_T cmd_addr_type; ///< Flag for address type } CommandDefinition; // A list used for saving values of "emsg_silent". Used by ex_try() to save the diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 0ffe67a4db..a5eccc12b9 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -85,7 +85,7 @@ typedef struct ucmd { char_u *uc_rep; // The command's replacement string long uc_def; // The default value for a range/count int uc_compl; // completion type - int uc_addr_type; // The command's address type + cmd_addr_T uc_addr_type; // The command's address type sctx_T uc_script_ctx; // SCTX where the command was defined char_u *uc_compl_arg; // completion argument if any } ucmd_T; @@ -1734,6 +1734,9 @@ static char_u * do_one_cmd(char_u **cmdlinep, ea.line2 = 1; } break; + case ADDR_NONE: + IEMSG(_("INTERNAL: Cannot use DFLALL with ADDR_NONE")); + break; } } @@ -2347,6 +2350,9 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent) case ADDR_QUICKFIX: eap->line2 = qf_get_cur_valid_idx(eap); break; + case ADDR_NONE: + // Will give an error later if a range is found. + break; } eap->cmd = skipwhite(eap->cmd); lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent, @@ -2412,6 +2418,9 @@ int parse_cmd_address(exarg_T *eap, char_u **errormsg, bool silent) eap->line2 = 1; } break; + case ADDR_NONE: + // Will give an error later if a range is found. + break; } eap->addr_count++; } else if (*eap->cmd == '*') { @@ -3698,12 +3707,14 @@ char_u *skip_range( // Return MAXLNUM when no Ex address was found. static linenr_T get_address(exarg_T *eap, char_u **ptr, - int addr_type, // flag: one of ADDR_LINES, ... + cmd_addr_T addr_type_arg, int skip, // only skip the address, don't use it bool silent, // no errors or side effects int to_other_file, // flag: may jump to other file int address_count) // 1 for first, >1 after comma + FUNC_ATTR_NONNULL_ALL { + const int addr_type = addr_type_arg; int c; int i; long n; @@ -3737,6 +3748,7 @@ static linenr_T get_address(exarg_T *eap, lnum = CURRENT_TAB_NR; break; case ADDR_TABS_RELATIVE: + case ADDR_NONE: EMSG(_(e_invrange)); cmd = NULL; goto error; @@ -3776,6 +3788,7 @@ static linenr_T get_address(exarg_T *eap, lnum = LAST_TAB_NR; break; case ADDR_TABS_RELATIVE: + case ADDR_NONE: EMSG(_(e_invrange)); cmd = NULL; goto error; @@ -3938,6 +3951,8 @@ static linenr_T get_address(exarg_T *eap, case ADDR_QUICKFIX: lnum = qf_get_cur_valid_idx(eap); break; + case ADDR_NONE: + break; } } @@ -4089,6 +4104,9 @@ static char_u *invalid_range(exarg_T *eap) return (char_u *)_(e_invrange); } break; + case ADDR_NONE: + // Will give an error elsewhere. + break; } } return NULL; @@ -4957,7 +4975,8 @@ char_u *get_command_name(expand_T *xp, int idx) static int uc_add_command(char_u *name, size_t name_len, char_u *rep, uint32_t argt, long def, int flags, int compl, - char_u *compl_arg, int addr_type, int force) + char_u *compl_arg, cmd_addr_T addr_type, bool force) + FUNC_ATTR_NONNULL_ARG(1, 3) { ucmd_T *cmd = NULL; char_u *p; @@ -5049,7 +5068,7 @@ fail: static struct { - int expand; + cmd_addr_T expand; char *name; char *shortname; } addr_type_complete[] = @@ -5062,7 +5081,7 @@ static struct { { ADDR_WINDOWS, "windows", "win" }, { ADDR_QUICKFIX, "quickfix", "qf" }, { ADDR_OTHER, "other", "?" }, - { -1, NULL, NULL } + { ADDR_NONE, NULL, NULL } }; /* @@ -5236,7 +5255,7 @@ static void uc_list(char_u *name, size_t name_len) } while (len < 8 - over); // Address Type - for (j = 0; addr_type_complete[j].expand != -1; j++) { + for (j = 0; addr_type_complete[j].expand != ADDR_NONE; j++) { if (addr_type_complete[j].expand != ADDR_LINES && addr_type_complete[j].expand == cmd->uc_addr_type) { STRCPY(IObuff + len, addr_type_complete[j].shortname); @@ -5284,7 +5303,8 @@ static void uc_list(char_u *name, size_t name_len) static int uc_scan_attr(char_u *attr, size_t len, uint32_t *argt, long *def, int *flags, int *complp, char_u **compl_arg, - int *addr_type_arg) + cmd_addr_T *addr_type_arg) + FUNC_ATTR_NONNULL_ALL { char_u *p; @@ -5421,7 +5441,7 @@ static void ex_command(exarg_T *eap) int flags = 0; int compl = EXPAND_NOTHING; char_u *compl_arg = NULL; - int addr_type_arg = ADDR_LINES; + cmd_addr_T addr_type_arg = ADDR_LINES; int has_attr = (eap->arg[0] == '-'); int name_len; @@ -6080,11 +6100,12 @@ char_u *get_user_cmd_complete(expand_T *xp, int idx) * Parse address type argument */ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt, - int *addr_type_arg) + cmd_addr_T *addr_type_arg) + FUNC_ATTR_NONNULL_ALL { int i, a, b; - for (i = 0; addr_type_complete[i].expand != -1; i++) { + for (i = 0; addr_type_complete[i].expand != ADDR_NONE; i++) { a = (int)STRLEN(addr_type_complete[i].name) == vallen; b = STRNCMP(value, addr_type_complete[i].name, vallen) == 0; if (a && b) { @@ -6093,7 +6114,7 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt, } } - if (addr_type_complete[i].expand == -1) { + if (addr_type_complete[i].expand == ADDR_NONE) { char_u *err = value; for (i = 0; err[i] != NUL && !ascii_iswhite(err[i]); i++) {} @@ -6117,6 +6138,7 @@ int parse_addr_type_arg(char_u *value, int vallen, uint32_t *argt, */ int parse_compl_arg(const char_u *value, int vallen, int *complp, uint32_t *argt, char_u **compl_arg) + FUNC_ATTR_NONNULL_ALL { const char_u *arg = NULL; size_t arglen = 0; @@ -9489,7 +9511,7 @@ Dictionary commands_array(buf_T *buf) PUT(d, "range", obj); obj = NIL; - for (int j = 0; addr_type_complete[j].expand != -1; j++) { + for (int j = 0; addr_type_complete[j].expand != ADDR_NONE; j++) { if (addr_type_complete[j].expand != ADDR_LINES && addr_type_complete[j].expand == cmd->uc_addr_type) { obj = STRING_OBJ(cstr_to_string(addr_type_complete[j].name)); diff --git a/src/nvim/generators/gen_ex_cmds.lua b/src/nvim/generators/gen_ex_cmds.lua index 849c82f50e..2574af6218 100644 --- a/src/nvim/generators/gen_ex_cmds.lua +++ b/src/nvim/generators/gen_ex_cmds.lua @@ -62,7 +62,7 @@ for _, cmd in ipairs(defs) do .cmd_name = (char_u *) "%s", .cmd_func = (ex_func_T)&%s, .cmd_argt = %uL, - .cmd_addr_type = %i + .cmd_addr_type = %s }, ]], enumname, cmd.command, cmd.func, cmd.flags, cmd.addr_type)) end diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 566a5ae9d6..c53c1546a4 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -935,6 +935,7 @@ EXTERN char_u e_readonly[] INIT(= N_( "E45: 'readonly' option is set (add ! to override)")); EXTERN char_u e_readonlyvar[] INIT(= N_( "E46: Cannot change read-only variable \"%.*s\"")); +EXTERN char_u e_stringreq[] INIT(= N_("E928: String required")); EXTERN char_u e_dictreq[] INIT(= N_("E715: Dictionary required")); EXTERN char_u e_toomanyarg[] INIT(= N_( "E118: Too many arguments for function: %s")); @@ -1052,4 +1053,7 @@ typedef enum { #define MIN_CD_SCOPE kCdScopeWindow #define MAX_CD_SCOPE kCdScopeGlobal +// Only filled for Win32. +EXTERN char windowsVersion[20] INIT(= { 0 }); + #endif // NVIM_GLOBALS_H diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c index 2c954008b3..4ec949759c 100644 --- a/src/nvim/hardcopy.c +++ b/src/nvim/hardcopy.c @@ -964,7 +964,6 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T #define PRT_PS_DEFAULT_DPI (72) // Default user space resolution #define PRT_PS_DEFAULT_FONTSIZE (10) -#define PRT_PS_DEFAULT_BUFFER_SIZE (80) #define PRT_MEDIASIZE_LEN (sizeof(prt_mediasize) / \ sizeof(struct prt_mediasize_S)) diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua index 2c7ab46ffe..b20fbbf038 100644 --- a/src/nvim/lua/vim.lua +++ b/src/nvim/lua/vim.lua @@ -115,7 +115,8 @@ function vim._load_package(name) for _,path in ipairs(paths) do local found = vim.api.nvim_get_runtime_file(path, false) if #found > 0 then - return loadfile(found[1]) + local f, err = loadfile(found[1]) + return f or error(err) end end @@ -123,7 +124,8 @@ function vim._load_package(name) local path = "lua/"..trail:gsub('?',basename) local found = vim.api.nvim_get_runtime_file(path, false) if #found > 0 then - return package.loadlib(found[1]) + local f, err = package.loadlib(found[1]) + return f or error(err) end end return nil diff --git a/src/nvim/macros.h b/src/nvim/macros.h index 07dcb4a8e8..303722b4a8 100644 --- a/src/nvim/macros.h +++ b/src/nvim/macros.h @@ -98,9 +98,6 @@ # define UTF_COMPOSINGLIKE(p1, p2) utf_composinglike((p1), (p2)) -// Whether to draw the vertical bar on the right side of the cell. -# define CURSOR_BAR_RIGHT (curwin->w_p_rl && (!(State & CMDLINE) || cmdmsg_rl)) - // MB_PTR_ADV(): advance a pointer to the next character, taking care of // multi-byte characters if needed. // MB_PTR_BACK(): backup a pointer to the previous character, taking care of diff --git a/src/nvim/main.c b/src/nvim/main.c index 79c165419e..fd8264583b 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -169,6 +169,14 @@ void early_init(mparm_T *paramp) init_normal_cmds(); // Init the table of Normal mode commands. highlight_init(); +#ifdef WIN32 + OSVERSIONINFO ovi; + ovi.dwOSVersionInfoSize = sizeof(ovi); + GetVersionEx(&ovi); + snprintf(windowsVersion, sizeof(windowsVersion), "%d.%d", + (int)ovi.dwMajorVersion, (int)ovi.dwMinorVersion); +#endif + #if defined(HAVE_LOCALE_H) // Setup to use the current locale (for ctype() and many other things). // NOTE: Translated messages with encodings other than latin1 will not @@ -1414,7 +1422,10 @@ static void read_stdin(void) no_wait_return = true; int save_msg_didany = msg_didany; set_buflisted(true); - (void)open_buffer(true, NULL, 0); // create memfile and read file + + // Create memfile and read from stdin. + (void)open_buffer(true, NULL, 0); + if (BUFEMPTY() && curbuf->b_next != NULL) { // stdin was empty, go to buffer 2 (e.g. "echo file1 | xargs nvim"). #8561 do_cmdline_cmd("silent! bnext"); diff --git a/src/nvim/marktree.c b/src/nvim/marktree.c index e9ea2cbba9..b3afdefac1 100644 --- a/src/nvim/marktree.c +++ b/src/nvim/marktree.c @@ -55,7 +55,6 @@ #define T MT_BRANCH_FACTOR #define ILEN (sizeof(mtnode_t)+(2 * T) * sizeof(void *)) -#define key_t SKRAPET #define RIGHT_GRAVITY (((uint64_t)1) << 63) #define ANTIGRAVITY(id) ((id)&(RIGHT_GRAVITY-1)) @@ -65,8 +64,6 @@ #define END_FLAG MARKTREE_END_FLAG #define ID_INCR (((uint64_t)1) << 2) -#define PROP_MASK (RIGHT_GRAVITY|PAIRED|END_FLAG) - #define rawkey(itr) (itr->node->key[itr->i]) static bool pos_leq(mtpos_t a, mtpos_t b) diff --git a/src/nvim/option.c b/src/nvim/option.c index acca6fe681..7cf8412269 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -206,7 +206,6 @@ typedef struct vimoption { // local option: indirect option index char_u *def_val[2]; // default values for variable (vi and vim) LastSet last_set; // script in which the option was last set -# define SCTX_INIT , { 0, 0, 0 } } vimoption_T; #define VI_DEFAULT 0 // def_val[VI_DEFAULT] is Vi default value diff --git a/src/nvim/popupmnu.c b/src/nvim/popupmnu.c index f242b7d71a..551a650045 100644 --- a/src/nvim/popupmnu.c +++ b/src/nvim/popupmnu.c @@ -742,6 +742,7 @@ static int pum_set_selected(int n, int repeat) // Edit a new, empty buffer. Set options for a "wipeout" // buffer. set_option_value("swf", 0L, NULL, OPT_LOCAL); + set_option_value("bl", 0L, NULL, OPT_LOCAL); set_option_value("bt", 0L, "nofile", OPT_LOCAL); set_option_value("bh", 0L, "wipe", OPT_LOCAL); set_option_value("diff", 0L, NULL, OPT_LOCAL); diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 1c88bd4ba4..2878e73573 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -3605,6 +3605,22 @@ theend: if (backpos.ga_maxlen > BACKPOS_INITIAL) ga_clear(&backpos); + // Make sure the end is never before the start. Can happen when \zs and + // \ze are used. + if (REG_MULTI) { + const lpos_T *const start = &rex.reg_mmatch->startpos[0]; + const lpos_T *const end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) { + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + } else { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 7dfd16fb4f..137b2304c0 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -6591,6 +6591,22 @@ static long nfa_regexec_both(char_u *line, colnr_T startcol, #endif theend: + // Make sure the end is never before the start. Can happen when \zs and + // \ze are used. + if (REG_MULTI) { + const lpos_T *const start = &rex.reg_mmatch->startpos[0]; + const lpos_T *const end = &rex.reg_mmatch->endpos[0]; + + if (end->lnum < start->lnum + || (end->lnum == start->lnum && end->col < start->col)) { + rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + } + } else { + if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) { + rex.reg_match->endp[0] = rex.reg_match->startp[0]; + } + } + return retval; } diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim index 15c1836c9a..ccc5e6ffc9 100644 --- a/src/nvim/testdir/test_options.vim +++ b/src/nvim/testdir/test_options.vim @@ -348,6 +348,16 @@ func Test_set_values() endif endfunc +func Test_renderoptions() + throw 'skipped: Nvim does not support renderoptions' + " Only do this for Windows Vista and later, fails on Windows XP and earlier. + " Doesn't hurt to do this on a non-Windows system. + if windowsversion() !~ '^[345]\.' + set renderoptions=type:directx + set rop=type:directx + endif +endfunc + func ResetIndentexpr() set indentexpr= endfunc diff --git a/src/nvim/testdir/test_regexp_latin.vim b/src/nvim/testdir/test_regexp_latin.vim index 2ee0ee1c0c..1bb2ee53de 100644 --- a/src/nvim/testdir/test_regexp_latin.vim +++ b/src/nvim/testdir/test_regexp_latin.vim @@ -755,6 +755,13 @@ func Test_start_end_of_buffer_match() bwipe! endfunc +func Test_ze_before_zs() + call assert_equal('', matchstr(' ', '\%#=1\ze \zs')) + call assert_equal('', matchstr(' ', '\%#=2\ze \zs')) + call assert_equal(repeat([''], 10), matchlist(' ', '\%#=1\ze \zs')) + call assert_equal(repeat([''], 10), matchlist(' ', '\%#=2\ze \zs')) +endfunc + " Check for detecting error func Test_regexp_error() set regexpengine=2 diff --git a/src/nvim/testdir/test_signs.vim b/src/nvim/testdir/test_signs.vim index 2b7672f1af..1e6c311374 100644 --- a/src/nvim/testdir/test_signs.vim +++ b/src/nvim/testdir/test_signs.vim @@ -15,14 +15,8 @@ func Test_sign() " icon is ignored when not supported. "(not supported)" is shown after " the icon name when listing signs. sign define Sign1 text=x - try - sign define Sign2 text=xy texthl=Title linehl=Error - \ icon=../../pixmaps/stock_vim_find_help.png - catch /E255:/ - " Ignore error: E255: Couldn't read in sign data! - " This error can happen when running in the GUI. - " Some gui like Motif do not support the png icon format. - endtry + + call Sign_command_ignore_error('sign define Sign2 text=xy texthl=Title linehl=Error icon=../../pixmaps/stock_vim_find_help.png') " Test listing signs. let a=execute('sign list') @@ -104,12 +98,7 @@ func Test_sign() edit foo call setline(1, ['A', 'B', 'C', 'D']) - try - sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist - \ icon=doesnotexist.xpm - catch /E255:/ - " ignore error: E255: it can happens for guis. - endtry + call Sign_command_ignore_error('sign define Sign3 text=y texthl=DoesNotExist linehl=DoesNotExist icon=doesnotexist.xpm') let fn = expand('%:p') exe 'sign place 43 line=2 name=Sign3 file=' . fn @@ -378,6 +367,25 @@ func Test_sign_delete_buffer() sign undefine Sign endfunc +" Ignore error: E255: Couldn't read in sign data! +" This error can happen when running in the GUI. +" Some gui like Motif do not support the png icon format. +func Sign_command_ignore_error(cmd) + try + exe a:cmd + catch /E255:/ + endtry +endfunc + +" ignore error: E255: Couldn't read in sign data! +" This error can happen when running in gui. +func Sign_define_ignore_error(name, attr) + try + call sign_define(a:name, a:attr) + catch /E255:/ + endtry +endfunc + " Test for Vim script functions for managing signs func Test_sign_funcs() " Remove all the signs @@ -394,12 +402,7 @@ func Test_sign_funcs() call sign_define("sign2") let attr = {'text' : '!!', 'linehl' : 'DiffAdd', 'texthl' : 'DiffChange', \ 'icon' : 'sign2.ico'} - try - call sign_define("sign2", attr) - catch /E255:/ - " ignore error: E255: Couldn't read in sign data! - " This error can happen when running in gui. - endtry + call Sign_define_ignore_error("sign2", attr) call assert_equal([{'name' : 'sign2', 'texthl' : 'DiffChange', \ 'linehl' : 'DiffAdd', 'text' : '!!', 'icon' : 'sign2.ico'}], \ sign_getdefined("sign2")) @@ -508,6 +511,16 @@ func Test_sign_funcs() call assert_fails('call sign_undefine("none")', 'E155:') call assert_fails('call sign_undefine([])', 'E730:') + " Test for using '.' as the line number for sign_place() + call Sign_define_ignore_error("sign1", attr) + call cursor(22, 1) + call assert_equal(15, sign_place(15, '', 'sign1', 'Xsign', + \ {'lnum' : '.'})) + call assert_equal([{'bufnr' : bufnr(''), 'signs' : + \ [{'id' : 15, 'group' : '', 'lnum' : 22, 'name' : 'sign1', + \ 'priority' : 10}]}], + \ sign_getplaced('%', {'lnum' : 22})) + call delete("Xsign") call sign_unplace('*') call sign_undefine() diff --git a/src/nvim/version.c b/src/nvim/version.c index 6be2a61c6a..834d27cc84 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -16,7 +16,6 @@ #include "nvim/iconv.h" #include "nvim/version.h" #include "nvim/charset.h" -#include "nvim/macros.h" #include "nvim/memline.h" #include "nvim/memory.h" #include "nvim/message.h" diff --git a/src/nvim/version.h b/src/nvim/version.h index c10f6fa534..4af038dd6c 100644 --- a/src/nvim/version.h +++ b/src/nvim/version.h @@ -2,6 +2,7 @@ #define NVIM_VERSION_H #include "nvim/ex_cmds_defs.h" +#include "nvim/macros.h" // defined in version.c extern char* Version; @@ -10,14 +11,20 @@ extern char* longVersion; // // Vim version number, name, etc. Patchlevel is defined in version.c. // + +// Values that change for a new release #define VIM_VERSION_MAJOR 8 #define VIM_VERSION_MINOR 0 + +// Values based on the above +#define VIM_VERSION_MAJOR_STR STR(VIM_VERSION_MAJOR) +#define VIM_VERSION_MINOR_STR STR(VIM_VERSION_MINOR) #define VIM_VERSION_100 (VIM_VERSION_MAJOR * 100 + VIM_VERSION_MINOR) // used for the runtime directory name -#define VIM_VERSION_NODOT "vim80" +#define VIM_VERSION_NODOT "vim" VIM_VERSION_MAJOR_STR VIM_VERSION_MINOR_STR // swap file compatibility (max. length is 6 chars) -#define VIM_VERSION_SHORT "8.0" +#define VIM_VERSION_SHORT VIM_VERSION_MAJOR_STR "." VIM_VERSION_MINOR_STR #ifdef INCLUDE_GENERATED_DECLARATIONS # include "version.h.generated.h" diff --git a/test/functional/core/startup_spec.lua b/test/functional/core/startup_spec.lua index ff0fdbea45..d5f03db03a 100644 --- a/test/functional/core/startup_spec.lua +++ b/test/functional/core/startup_spec.lua @@ -428,9 +428,9 @@ end) describe('clean', function() clear() - ok(string.match(meths.get_option('runtimepath'), funcs.stdpath('config')) ~= nil) + ok(string.find(meths.get_option('runtimepath'), funcs.stdpath('config'), 1, true) ~= nil) clear('--clean') - ok(string.match(meths.get_option('runtimepath'), funcs.stdpath('config')) == nil) + ok(string.find(meths.get_option('runtimepath'), funcs.stdpath('config'), 1, true) == nil) end) describe('user config init', function() diff --git a/test/functional/eval/executable_spec.lua b/test/functional/eval/executable_spec.lua index a1cf056907..28aefb72e5 100644 --- a/test/functional/eval/executable_spec.lua +++ b/test/functional/eval/executable_spec.lua @@ -2,6 +2,7 @@ local helpers = require('test.functional.helpers')(after_each) local eq, clear, call, iswin, write_file, command = helpers.eq, helpers.clear, helpers.call, helpers.iswin, helpers.write_file, helpers.command +local exc_exec = helpers.exc_exec local eval = helpers.eval describe('executable()', function() @@ -10,6 +11,20 @@ describe('executable()', function() it('returns 1 for commands in $PATH', function() local exe = iswin() and 'ping' or 'ls' eq(1, call('executable', exe)) + command('let $PATH = fnamemodify("./test/functional/fixtures/bin", ":p")') + eq(1, call('executable', 'null')) + eq(1, call('executable', 'true')) + eq(1, call('executable', 'false')) + end) + + it('fails for invalid values', function() + for _, input in ipairs({'""', 'v:null', 'v:true', 'v:false', '{}', '[]'}) do + eq('Vim(call):E928: String required', exc_exec('call executable('..input..')')) + end + command('let $PATH = fnamemodify("./test/functional/fixtures/bin", ":p")') + for _, input in ipairs({'v:null', 'v:true', 'v:false'}) do + eq('Vim(call):E928: String required', exc_exec('call executable('..input..')')) + end end) it('returns 0 for non-existent files', function() diff --git a/test/functional/eval/exepath_spec.lua b/test/functional/eval/exepath_spec.lua index 10a11aeacc..08d2c59af8 100644 --- a/test/functional/eval/exepath_spec.lua +++ b/test/functional/eval/exepath_spec.lua @@ -1,14 +1,40 @@ local helpers = require('test.functional.helpers')(after_each) local eq, clear, call, iswin = helpers.eq, helpers.clear, helpers.call, helpers.iswin +local command = helpers.command +local exc_exec = helpers.exc_exec +local matches = helpers.matches -describe('exepath() (Windows)', function() - if not iswin() then return end -- N/A for Unix. +describe('exepath()', function() + before_each(clear) - it('append extension if omitted', function() - local filename = 'cmd' - local pathext = '.exe' - clear({env={PATHEXT=pathext}}) - eq(call('exepath', filename..pathext), call('exepath', filename)) + it('returns 1 for commands in $PATH', function() + local exe = iswin() and 'ping' or 'ls' + local ext_pat = iswin() and '%.EXE$' or '$' + matches(exe .. ext_pat, call('exepath', exe)) + command('let $PATH = fnamemodify("./test/functional/fixtures/bin", ":p")') + ext_pat = iswin() and '%.CMD$' or '$' + matches('null' .. ext_pat, call('exepath', 'null')) + matches('true' .. ext_pat, call('exepath', 'true')) + matches('false' .. ext_pat, call('exepath', 'false')) end) + + it('fails for invalid values', function() + for _, input in ipairs({'""', 'v:null', 'v:true', 'v:false', '{}', '[]'}) do + eq('Vim(call):E928: String required', exc_exec('call exepath('..input..')')) + end + command('let $PATH = fnamemodify("./test/functional/fixtures/bin", ":p")') + for _, input in ipairs({'v:null', 'v:true', 'v:false'}) do + eq('Vim(call):E928: String required', exc_exec('call exepath('..input..')')) + end + end) + + if iswin() then + it('append extension if omitted', function() + local filename = 'cmd' + local pathext = '.exe' + clear({env={PATHEXT=pathext}}) + eq(call('exepath', filename..pathext), call('exepath', filename)) + end) + end end) diff --git a/test/functional/eval/function_spec.lua b/test/functional/eval/function_spec.lua index 776e760aaf..ce8850fcc2 100644 --- a/test/functional/eval/function_spec.lua +++ b/test/functional/eval/function_spec.lua @@ -2,7 +2,10 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq = helpers.eq +local matches = helpers.matches local exc_exec = helpers.exc_exec +local iswin = helpers.iswin +local eval = helpers.eval describe('Up to MAX_FUNC_ARGS arguments are handled by', function() local max_func_args = 20 -- from eval.h @@ -27,3 +30,8 @@ describe('Up to MAX_FUNC_ARGS arguments are handled by', function() eq('Vim(call):E740: Too many arguments for function rpcnotify', ret) end) end) + +it('windowsversion()', function() + clear() + matches(iswin() and '^%d+%.%d+$' or '^$', eval('windowsversion()')) +end) diff --git a/test/functional/fixtures/bin/false b/test/functional/fixtures/bin/false new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/false diff --git a/test/functional/fixtures/bin/false.cmd b/test/functional/fixtures/bin/false.cmd new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/false.cmd diff --git a/test/functional/fixtures/bin/null b/test/functional/fixtures/bin/null new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/null diff --git a/test/functional/fixtures/bin/null.cmd b/test/functional/fixtures/bin/null.cmd new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/null.cmd diff --git a/test/functional/fixtures/bin/true b/test/functional/fixtures/bin/true new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/true diff --git a/test/functional/fixtures/bin/true.cmd b/test/functional/fixtures/bin/true.cmd new file mode 100755 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/functional/fixtures/bin/true.cmd diff --git a/test/functional/fixtures/lua/syntax_error.lua b/test/functional/fixtures/lua/syntax_error.lua new file mode 100644 index 0000000000..8c0cf026ee --- /dev/null +++ b/test/functional/fixtures/lua/syntax_error.lua @@ -0,0 +1 @@ +- <= the syntax error diff --git a/test/functional/lua/treesitter_spec.lua b/test/functional/lua/treesitter_spec.lua index 0e823426ae..f34cbbb65b 100644 --- a/test/functional/lua/treesitter_spec.lua +++ b/test/functional/lua/treesitter_spec.lua @@ -22,6 +22,10 @@ describe('treesitter API', function() matches("Error executing lua: Failed to load parser: uv_dlopen: .+", pcall_err(exec_lua, "parser = vim.treesitter.require_language('borklang', 'borkbork.so')")) + -- Should not throw an error when silent + eq(false, exec_lua("return vim.treesitter.require_language('borklang', nil, true)")) + eq(false, exec_lua("return vim.treesitter.require_language('borklang', 'borkbork.so', true)")) + eq("Error executing lua: .../language.lua:0: no parser for 'borklang' language, see :help treesitter-parsers", pcall_err(exec_lua, "parser = vim.treesitter.inspect_language('borklang')")) end) diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index e9e1f7ec12..e253db5297 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -1453,3 +1453,18 @@ describe('lua stdlib', function() end) end) end) + +describe('lua: require("mod") from packages', function() + before_each(function() + command('set rtp+=test/functional/fixtures') + end) + + it('propagates syntax error', function() + local syntax_error_msg = exec_lua [[ + local _, err = pcall(require, "syntax_error") + return err + ]] + + matches("unexpected symbol", syntax_error_msg) + end) +end) diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua index 3ef41fde1d..8a5dd7ef18 100644 --- a/test/functional/terminal/tui_spec.lua +++ b/test/functional/terminal/tui_spec.lua @@ -1477,7 +1477,7 @@ describe("TUI", function() retry(nil, 3000, function() -- Wait for log file to be flushed. local log = read_file('Xtest_tui_verbose_log') or '' - eq('--- Terminal info --- {{{\n', string.match(log, '--- Terminal.-\n')) + eq('--- Terminal info --- {{{\n', string.match(log, '%-%-%- Terminal.-\n')) ok(#log > 50) end) end) |