neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 029b7a149fa77cefe45e8df5524ef41ed4ee78eb
parent dc67ba948eec0a5628eff0b15ce87a7d27f58bb3
Author: Justin M. Keyes <justinkz@gmail.com>
Date:   Mon, 28 Jul 2025 22:23:07 -0400

Merge #35000 docs: lsp, ui events, dev guidance


Diffstat:
Mruntime/doc/api-ui-events.txt | 6++++++
Mruntime/doc/api.txt | 3+++
Mruntime/doc/develop.txt | 16++++++++++++----
Mruntime/doc/editing.txt | 8++++----
Mruntime/doc/help.txt | 1-
Mruntime/doc/lsp.txt | 62++++++++++++++++++++++++++++++++++++++++----------------------
Mruntime/doc/lua.txt | 11++++++++++-
Mruntime/doc/news.txt | 9++++-----
Mruntime/doc/options.txt | 5+++--
Mruntime/doc/pack.txt | 108++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mruntime/doc/repeat.txt | 2+-
Mruntime/doc/terminal.txt | 42+++++++++++++++++++++++++-----------------
Druntime/doc/testing.txt | 54------------------------------------------------------
Mruntime/doc/treesitter.txt | 6++----
Mruntime/doc/usr_41.txt | 2+-
Mruntime/doc/various.txt | 11++++++++---
Mruntime/doc/vimeval.txt | 2+-
Mruntime/doc/vimfn.txt | 40++++++++++++++++++++--------------------
Mruntime/doc/windows.txt | 4++--
Mruntime/lua/vim/_core/server.lua | 15++++++++-------
Mruntime/lua/vim/_meta/api.lua | 4++++
Mruntime/lua/vim/_meta/options.lua | 5+++--
Mruntime/lua/vim/_meta/vimfn.lua | 40++++++++++++++++++++--------------------
Mruntime/lua/vim/_system.lua | 4++++
Mruntime/lua/vim/net.lua | 16+++++-----------
Mruntime/lua/vim/secure.lua | 12++++++++----
Mruntime/lua/vim/shared.lua | 2+-
Mruntime/lua/vim/treesitter/query.lua | 5++---
Mscripts/vim-patch.sh | 2+-
Msrc/gen/gen_help_html.lua | 1+
Msrc/nvim/api/vim.c | 6++++--
Msrc/nvim/eval.lua | 40++++++++++++++++++++--------------------
Msrc/nvim/globals.h | 14+++++++-------
Msrc/nvim/lua/secure.c | 6+++---
Msrc/nvim/options.lua | 5+++--
Mtest/functional/core/server_spec.lua | 14++++++--------
Mtest/functional/core/startup_spec.lua | 4++--
Mtest/functional/ex_cmds/trust_spec.lua | 16++++++++--------
Mtest/functional/lua/secure_spec.lua | 51+++++++++++++++++++++++++--------------------------
39 files changed, 331 insertions(+), 323 deletions(-)

diff --git a/runtime/doc/api-ui-events.txt b/runtime/doc/api-ui-events.txt @@ -882,6 +882,12 @@ must handle. clearing the screen (messages sent by other "msg_" events below should not be affected). + Guidance: The "clear messages" behavior is UI-specific. If the UI + presents messages in a new window, it may choose to clear messages + after a few seconds. If the UI presents messages in a persistent area + (e.g. cmdline), it should clear messages at the start of the next + batch (typically, the next event-loop cycle). + ["msg_showmode", content] ~ Shows 'showmode' and |recording| messages. `content` has the same format as in "msg_show". This event is sent with empty `content` to diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt @@ -1311,6 +1311,9 @@ nvim_replace_termcodes({str}, {from_part}, {do_lt}, {special}) Replaces terminal codes and |keycodes| (<CR>, <Esc>, ...) in a string with the internal representation. + Note: ~ + • Lua can use |vim.keycode()| instead. + Attributes: ~ Since: 0.1.0 diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt @@ -353,7 +353,7 @@ Where possible, these patterns apply to _both_ Lua and the API: - Examples: |vim.lsp.codelens.clear()| |vim.diagnostic.enable()| - Any function signature that accepts a callback (example: |table.foreach()|) should place it as the LAST parameter (after opts), if possible (or ALWAYS - for "continuation callbacks"—functions called exactly once). + for |continuation|s——functions called exactly once). - Improves readability by placing the less "noisy" arguments near the start. - Consistent with luv. - Useful for future async lib which transforms functions of the form @@ -426,9 +426,9 @@ Use existing common {verb} names (actions) if possible: - add: Appends or inserts into a collection - attach: Listens to something to get events from it (TODO: rename to "on"?) - call: Calls a function - - callback Continuation callback: a single function parameter (not - a field) that returns the result of an async function. Use - "on_…" for all other callbacks and event handlers. + - callback |continuation|: Function parameter (NOT a field) that + returns the result of an async function. Use the "on_…" + naming-convention for all other callbacks and event handlers. - cancel: Cancels or dismisses an event or interaction, typically user-initiated and without error. (Compare "abort", which cancels and signals error/failure.) @@ -499,6 +499,14 @@ Use this format to name API (RPC) events: > Example: > nvim_buf_changedtick_event < + *continuation* +A "continuation" is implemented as a callback function that returns the result +of an async function and is called exactly once. Often accepts `err` as the +first parameter, to avoid erroring on the main thread. Example: > + foo(…, callback: fun(err, …)) +Use the name `callback` only for a continuation. All other callbacks and event +handlers should be named with the |dev-name-events| "on_…" convention. + *dev-api-name* Use this format to name new RPC |API| functions: > nvim_{topic}_{verb}_{arbitrary-qualifiers} diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt @@ -1242,10 +1242,10 @@ MULTIPLE WINDOWS AND BUFFERS *window-exit* *:confirm* *:conf* :conf[irm] {command} Execute {command}, and use a dialog when an operation has to be confirmed. Can be used on the - |:edit|, |:q|, |:qa| and |:w| commands (the latter to - override a read-only setting), and any commands that - can fail because of unsaved changes, such as |:only|, - |:buffer|, |:bdelete|, etc. + |:edit|, |:restart|, |:q|, |:qa| and |:w| commands + (the latter to override a read-only setting), and any + commands that can fail because of unsaved changes, + such as |:only|, |:buffer|, |:bdelete|, etc. Examples: > :confirm w foo diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt @@ -112,7 +112,6 @@ API (EXTENSIBILITY/SCRIPTING/PLUGINS) |channel| Nvim asynchronous IO |vimscript| Vimscript reference |vimscript-functions| Vimscript functions -|testing.txt| Vimscript testing functions |remote-plugin| Nvim remote plugins |health| Health checking diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt @@ -28,26 +28,19 @@ Follow these steps to get LSP features: upstream installation instructions. You can find language servers here: https://microsoft.github.io/language-server-protocol/implementors/servers/ -2. Use |vim.lsp.config()| to define a configuration for an LSP client - (see https://github.com/neovim/nvim-lspconfig for examples). +2. Define a new config |lsp-new-config| (or install https://github.com/neovim/nvim-lspconfig). Example: >lua vim.lsp.config['luals'] = { -- Command and arguments to start the server. cmd = { 'lua-language-server' }, - -- Filetypes to automatically attach to. filetypes = { 'lua' }, - - -- Sets the "root directory" to the parent directory of the file in the - -- current buffer that contains either a ".luarc.json" or a - -- ".luarc.jsonc" file. Files that share a root directory will reuse - -- the connection to the same LSP server. + -- Sets the "workspace" to the directory where any of these files is found. + -- Files that share a root directory will reuse the LSP server connection. -- Nested lists indicate equal priority, see |vim.lsp.Config|. root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' }, - - -- Specific settings to send to the server. The schema for this is - -- defined by the server. For example the schema for lua-language-server - -- can be found here https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json + -- Specific settings to send to the server. The schema is server-defined. + -- Example: https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json settings = { Lua = { runtime = { @@ -57,7 +50,7 @@ Follow these steps to get LSP features: } } -3. Use |vim.lsp.enable()| to enable a configuration. +3. Use |vim.lsp.enable()| to enable the config. Example: >lua vim.lsp.enable('luals') < @@ -130,21 +123,46 @@ CONFIG *lsp-config* You can configure LSP behavior statically via vim.lsp.config(), and dynamically via |lsp-attach| or |Client:on_attach()|. -Use |vim.lsp.config()| to define, and selectively enable, LSP configurations. -This is basically a wrapper around |vim.lsp.start()| which allows you to share -and merge configs (which may be provided by Nvim or third-party plugins). - -When an LSP client starts, it resolves its configuration by merging from the -following (in increasing priority): +Use |vim.lsp.config()| to define or modify LSP configurations, and +|vim.lsp.enable()| to auto-activate them. This is basically a wrapper around +|vim.lsp.start()| which allows you to share and merge configs (provided by +Nvim, plugins, and your local config). + + *lsp-new-config* +To create a new config you can either use `vim.lsp.config()` or create +a `lsp/<config-name>.lua` file. + +EXAMPLE: DEFINE A CONFIG AS CODE ~ + +1. Run `:lua vim.lsp.config('foo', {cmd={'true'}})` +2. Run `:lua vim.lsp.enable('foo')` +3. Run `:checkhealth vim.lsp`, check "Enabled Configurations". 😎 + +EXAMPLE: DEFINE A CONFIG AS A FILE ~ + +1. Create a file `lsp/foo.lua` somewhere on your 'runtimepath'. > + :exe 'edit' stdpath('config') .. '/lsp/foo.lua' +2. Add this code to the file (or copy an example from + https://github.com/neovim/nvim-lspconfig): > + return { + cmd = { 'true' }, + } +3. Save the file (with `++p` to ensure its parent directory is created). > + :write ++p +4. Enable the config. > + :lua vim.lsp.enable('foo') +5. Run `:checkhealth vim.lsp`, check "Enabled Configurations". 🌈 + + *lsp-config-merge* +When an LSP client starts, it resolves its configuration by merging the +following sources (merge semantics defined by |vim.tbl_deep_extend()|), in +order of increasing priority: 1. Configuration defined for the `'*'` name. 2. Configuration from the result of merging all tables returned by `lsp/<name>.lua` files in 'runtimepath' for a server of name `name`. 3. Configurations defined anywhere else. -Note: The merge semantics of configurations follow the behaviour of -|vim.tbl_deep_extend()|. - Example: given the following configs... >lua -- Defined in init.lua vim.lsp.config('*', { diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt @@ -191,7 +191,7 @@ IMPORTING LUA MODULES *lua-module-load* Modules are searched for under the directories specified in 'runtimepath' and |packages-runtimepath|, in the order they appear in the output of this command >vim - :echo nvim_list_runtime_paths() + :echo nvim_list_runtime_paths() < Any "." in the module name is treated as a directory separator when searching. For a module `foo.bar`, each directory is searched for `lua/foo/bar.lua`, then @@ -230,6 +230,11 @@ Note: plugins using shell, which will not work with paths containing semicolons, it is better to not have them in 'runtimepath' at all. + *lua-script-location* +To get its own location, Lua scripts/modules can use |debug.getinfo()|: > + debug.getinfo(1, 'S').source:sub(2) +< + ============================================================================== COMMANDS *lua-commands* @@ -1784,6 +1789,10 @@ SystemObj:write({data}) *SystemObj:write()* vim.system({cmd}, {opts}, {on_exit}) *vim.system()* Runs a system command or throws an error if {cmd} cannot be run. + The command runs directly (not in 'shell') so shell builtins such as + "echo" in cmd.exe, cmdlets in powershell, or "help" in bash, will not work + unless you actually invoke a shell: `vim.system({'bash', '-c', 'help'})`. + Examples: >lua local on_exit = function(obj) print(obj.code) diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt @@ -63,10 +63,7 @@ DIAGNOSTICS EDITOR -• |vim.secure.read()| now removes the choice "(a)llow" from the prompt reply for - files unlisted in the user's trust database, and thus requires the user to - choose (v)iew then run `:trust`. Previously the user would be able to press - the single key 'a' to execute the arbitrary execution immediately. +• todo EVENTS @@ -174,6 +171,8 @@ EDITOR commands. • 'wildchar' now enables completion in search contexts using |/|, |?|, |:g|, |:v| and |:vimgrep| commands. +• For security, 'exrc' no longer shows an "(a)llow" choice. Instead you must + "(v)iew" then run `:trust`. EVENTS @@ -277,7 +276,7 @@ TERMINAL TREESITTER -• todo +• |:EditQuery| command gained tab-completion, works with injected languages. TUI diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt @@ -2566,7 +2566,8 @@ A jump table for the options with a short description can be found at |Q_op|. Unset 'exrc' to stop further searching of 'exrc' files in parent directories, similar to |editorconfig.root|. - To get its own location, Lua exrc files can use |debug.getinfo()|. + To get its own location, a Lua exrc file can use |debug.getinfo()|. + See |lua-script-location|. Compare 'exrc' to |editorconfig|: - 'exrc' can execute any code; editorconfig only specifies settings. @@ -2576,7 +2577,7 @@ A jump table for the options with a short description can be found at |Q_op|. 1. Enable 'exrc'. 2. Place LSP configs at ".nvim/lsp/*.lua" in your project root. 3. Create ".nvim.lua" in your project root directory with this line: >lua - vim.cmd[[set runtimepath+=.nvim]] + vim.cmd[[set runtimepath+=.nvim]] < This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. diff --git a/runtime/doc/pack.txt b/runtime/doc/pack.txt @@ -8,7 +8,7 @@ Type |gO| to see the table of contents. ============================================================================== -Using Vim packages *packages* +Using Vim packages *packages* A Vim "package" is a directory that contains |plugin|s. Compared to normal plugins, a package can... @@ -20,34 +20,34 @@ plugins, a package can... located in "pack/*/start/*") and ones that are only loaded when needed with |:packadd| ("opt" packages, located in "pack/*/opt/*"). - *runtime-search-path* + *runtime-search-path* Nvim searches for |:runtime| files in: - 1. all paths in 'runtimepath' - 2. all "pack/*/start/*" dirs +- 1. all paths in 'runtimepath' +- 2. all "pack/*/start/*" dirs Note that the "pack/*/start/*" paths are not explicitly included in 'runtimepath', so they will not be reported by ":set rtp" or "echo &rtp". Scripts can use |nvim_list_runtime_paths()| to list all used directories, and |nvim_get_runtime_file()| to query for specific files or sub-folders within the runtime path. Example: > - " List all runtime dirs and packages with Lua paths. - :echo nvim_get_runtime_file("lua/", v:true) + " List all runtime dirs and packages with Lua paths. + :echo nvim_get_runtime_file("lua/", v:true) Using a package and loading automatically ~ Let's assume your Nvim files are in "~/.local/share/nvim/site" and you want to add a package from a zip archive "/tmp/foopack.zip": > - % mkdir -p ~/.local/share/nvim/site/pack/foo - % cd ~/.local/share/nvim/site/pack/foo - % unzip /tmp/foopack.zip + % mkdir -p ~/.local/share/nvim/site/pack/foo + % cd ~/.local/share/nvim/site/pack/foo + % unzip /tmp/foopack.zip The directory name "foo" is arbitrary, you can pick anything you like. -You would now have these files under ~/.local/share/nvim/site: - pack/foo/README.txt - pack/foo/start/foobar/plugin/foo.vim - pack/foo/start/foobar/syntax/some.vim - pack/foo/opt/foodebug/plugin/debugger.vim +You would now have these files under ~/.local/share/nvim/site: > + pack/foo/README.txt + pack/foo/start/foobar/plugin/foo.vim + pack/foo/start/foobar/syntax/some.vim + pack/foo/opt/foodebug/plugin/debugger.vim On startup after processing your |config|, Nvim scans all directories in 'packpath' for plugins in "pack/*/start/*", then loads the plugins. @@ -74,7 +74,7 @@ Loading packages automatically will not happen if loading plugins is disabled, see |load-plugins|. To load packages earlier, so that plugin/ files are sourced: - :packloadall + :packloadall This also works when loading plugins is disabled. The automatic loading will only happen once. @@ -86,21 +86,21 @@ Using a single plugin and loading it automatically ~ If you don't have a package but a single plugin, you need to create the extra directory level: > - % mkdir -p ~/.local/share/nvim/site/pack/foo/start/foobar - % cd ~/.local/share/nvim/site/pack/foo/start/foobar - % unzip /tmp/someplugin.zip + % mkdir -p ~/.local/share/nvim/site/pack/foo/start/foobar + % cd ~/.local/share/nvim/site/pack/foo/start/foobar + % unzip /tmp/someplugin.zip -You would now have these files: - pack/foo/start/foobar/plugin/foo.vim - pack/foo/start/foobar/syntax/some.vim +You would now have these files: > + pack/foo/start/foobar/plugin/foo.vim + pack/foo/start/foobar/syntax/some.vim From here it works like above. Optional plugins ~ - *pack-add* + *pack-add* To load an optional plugin from a pack use the `:packadd` command: > - :packadd foodebug + :packadd foodebug This searches for "pack/*/opt/foodebug" in 'packpath' and will find ~/.local/share/nvim/site/pack/foo/opt/foodebug/plugin/debugger.vim and source it. @@ -110,7 +110,7 @@ whether Nvim supports a feature or a dependency is missing. You can also load an optional plugin at startup, by putting this command in your |config|: > - :packadd! foodebug + :packadd! foodebug The extra "!" is so that the plugin isn't loaded if Nvim was started with |--noplugin|. @@ -129,17 +129,17 @@ Filetype plugins should go under "pack/*/start", so that they are always found. Unless you have more than one plugin for a file type and want to select which one to load with `:packadd`. E.g. depending on the compiler version: > - if foo_compiler_version > 34 - packadd foo_new - else - packadd foo_old - endif + if foo_compiler_version > 34 + packadd foo_new + else + packadd foo_old + endif The "after" directory is most likely not useful in a package. It's not disallowed though. ============================================================================== -Creating Vim packages *package-create* +Creating Vim packages *package-create* This assumes you write one or more plugins that you distribute as a package. @@ -154,28 +154,28 @@ bit harder to update to a new version. A repository can usually be kept up-to-date easily, but it requires a program like "git" to be available. You can do both, github can automatically create an archive for a release. -Your directory layout would be like this: - start/foobar/plugin/foo.vim " always loaded, defines commands - start/foobar/plugin/bar.vim " always loaded, defines commands - start/foobar/autoload/foo.vim " loaded when foo command used - start/foobar/doc/foo.txt " help for foo.vim - start/foobar/doc/tags " help tags - opt/fooextra/plugin/extra.vim " optional plugin, defines commands - opt/fooextra/autoload/extra.vim " loaded when extra command used - opt/fooextra/doc/extra.txt " help for extra.vim - opt/fooextra/doc/tags " help tags - +Your directory layout would be like this: > + start/foobar/plugin/foo.vim " always loaded, defines commands + start/foobar/plugin/bar.vim " always loaded, defines commands + start/foobar/autoload/foo.vim " loaded when foo command used + start/foobar/doc/foo.txt " help for foo.vim + start/foobar/doc/tags " help tags + opt/fooextra/plugin/extra.vim " optional plugin, defines commands + opt/fooextra/autoload/extra.vim " loaded when extra command used + opt/fooextra/doc/extra.txt " help for extra.vim + opt/fooextra/doc/tags " help tags +< This allows for the user to do: > - mkdir ~/.local/share/nvim/site/pack - cd ~/.local/share/nvim/site/pack - git clone https://github.com/you/foobar.git myfoobar + mkdir ~/.local/share/nvim/site/pack + cd ~/.local/share/nvim/site/pack + git clone https://github.com/you/foobar.git myfoobar Here "myfoobar" is a name that the user can choose, the only condition is that it differs from other packages. In your documentation you explain what the plugins do, and tell the user how to load the optional plugin: > - :packadd! fooextra + :packadd! fooextra You could add this packadd command in one of your plugins, to be executed when the optional plugin is needed. @@ -184,22 +184,22 @@ Run the `:helptags` command to generate the doc/tags file. Including this generated file in the package means that the user can drop the package in the pack directory and the help command works right away. Don't forget to re-run the command after changing the plugin help: > - :helptags path/start/foobar/doc - :helptags path/opt/fooextra/doc + :helptags path/start/foobar/doc + :helptags path/opt/fooextra/doc Dependencies between plugins ~ - *packload-two-steps* + *packload-two-steps* Suppose you have two plugins that depend on the same functionality. You can put the common functionality in an autoload directory, so that it will be found automatically. Your package would have these files: - pack/foo/start/one/plugin/one.vim > - call foolib#getit() -< pack/foo/start/two/plugin/two.vim > - call foolib#getit() -< pack/foo/start/lib/autoload/foolib.vim > - func foolib#getit() +pack/foo/start/one/plugin/one.vim > + call foolib#getit() +pack/foo/start/two/plugin/two.vim > + call foolib#getit() +pack/foo/start/lib/autoload/foolib.vim > + func foolib#getit() This works, because start packages will be searched for autoload files, when sourcing the plugins. diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt @@ -191,7 +191,7 @@ Using Vim scripts *using-scripts* For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|. - *:so* *:source* *load-vim-script* + *:so* *:source* :so[urce] {file} Runs |Ex-commands| or Lua code (".lua" files) from {file}. Triggers the |SourcePre| autocommand. diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt @@ -138,35 +138,43 @@ exposes via the |TermRequest| event. OSC 7: change working directory *terminal-osc7* -To handle OSC 7 emitted from :terminal processes, this code will :cd to the -directory indicated in the request. >lua +Shells can emit the "OSC 7" sequence to announce when the current directory +(CWD) changed. + +You can configure your shell init (e.g. ~/.bashrc) to emit OSC 7, or your +terminal may attempt to do it for you. + +To configure bash to emit OSC 7: >bash + function print_osc7() { + printf '\033]7;file://%s\033\\' "$PWD" + } + PROMPT_COMMAND='print_osc7' + +Having ensured that your shell emits OSC 7, you can now handle it in Nvim. The +following code will run :lcd whenever your shell CWD changes in a :terminal +buffer: >lua vim.api.nvim_create_autocmd({ 'TermRequest' }, { desc = 'Handles OSC 7 dir change requests', callback = function(ev) - if string.sub(ev.data.sequence, 1, 4) == '\x1b]7;' then - local dir = string.gsub(ev.data.sequence, '\x1b]7;file://[^/]*', '') + local val, n = string.gsub(ev.data.sequence, '\027]7;file://[^/]*', '') + if n > 0 then + -- OSC 7: dir-change + local dir = val if vim.fn.isdirectory(dir) == 0 then vim.notify('invalid dir: '..dir) return end - vim.api.nvim_buf_set_var(ev.buf, 'osc7_dir', dir) - if vim.o.autochdir and vim.api.nvim_get_current_buf() == ev.buf then - vim.cmd.cd(dir) + vim.b[ev.buf].osc7_dir = dir + if vim.api.nvim_get_current_buf() == ev.buf then + vim.cmd.lcd(dir) end end end }) - vim.api.nvim_create_autocmd({ 'BufEnter', 'WinEnter', 'DirChanged' }, { - callback = function(ev) - if vim.b.osc7_dir and vim.fn.isdirectory(vim.b.osc7_dir) == 1 then - vim.cmd.cd(vim.b.osc7_dir) - end - end - }) -To try it out, select the above code and source it with `:'<,'>lua` (or -`g==`), then run this command in a :terminal buffer: > +To try it out, select the above code and source it with `:'<,'>lua`, then run +this command in a :terminal buffer: > printf "\033]7;file://./foo/bar\033\\" @@ -191,7 +199,7 @@ Shells can emit semantic escape sequences (OSC 133) to mark where each prompt starts and ends. The start of a prompt is marked by sequence `OSC 133 ; A ST`, and the end by `OSC 133 ; B ST`. -You can configure your shell "rc" (e.g. ~/.bashrc) to emit OSC 133 sequences, +You can configure your shell init (e.g. ~/.bashrc) to emit OSC 133 sequences, or your terminal may attempt to do it for you (assuming your shell config doesn't interfere). diff --git a/runtime/doc/testing.txt b/runtime/doc/testing.txt @@ -1,54 +0,0 @@ -*testing.txt* Nvim - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -Testing Vim and Vim script *testing-support* - -Expression evaluation is explained in |eval.txt|. This file goes into details -about writing tests in Vim script. This can be used for testing Vim itself -and for testing plugins. - -1. Testing Vim |testing| -2. Test functions |test-functions-details| -3. Assert functions |assert-functions-details| - -============================================================================== -1. Testing Vim *testing* - -Vim can be tested after building it, usually with "make test". -The tests are located in the directory "src/testdir". - - *new-style-testing* -New tests should be added as new style tests. The test scripts are named -test_<feature>.vim (replace <feature> with the feature under test). These use -functions such as |assert_equal()| to keep the test commands and the expected -result in one place. - -Find more information in the file src/testdir/README.txt. - -============================================================================== -2. Test functions *test-functions-details* - -See |test_garbagecollect_now()|. - -============================================================================== -3. Assert functions *assert-functions-details* - -See: - - |assert_beeps()| - - |assert_equal()| - - |assert_equalfile()| - - |assert_exception()| - - |assert_fails()| - - |assert_false()| - - |assert_inrange()| - - |assert_match()| - - |assert_nobeep()| - - |assert_notequal()| - - |assert_notmatch()| - - |assert_report()| - - |assert_true()| - - vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt @@ -1321,10 +1321,8 @@ add_predicate({name}, {handler}, {opts}) edit({lang}) *vim.treesitter.query.edit()* Opens a live editor to query the buffer you started from. - Can also be shown with `:EditQuery`. *:EditQuery* - - `:EditQuery <tab>` completes the treesitter parser names in the runtime - path. + Can also be shown with the *:EditQuery* command. `:EditQuery <tab>` + completes available parsers. If you move the cursor to a capture name ("@foo"), text matching the capture is highlighted in the source buffer. The query editor is a scratch diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt @@ -31,7 +31,7 @@ script. There are a lot of them, thus this is a long chapter. Table of contents: |usr_toc.txt| ============================================================================== -*41.1* Introduction *vim-script-intro* *script* +*41.1* Introduction *vimscript-intro* Your first experience with Vim scripts is the vimrc file. Vim reads it when it starts up and executes the commands. You can set options to values you diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt @@ -248,10 +248,15 @@ gx Opens the current filepath or URL (decided by :sh[ell] Removed. |vim-differences| *:terminal* *:te* -:te[rminal][!] [{cmd}] Run {cmd} in a non-interactive 'shell' in a new - |terminal-emulator| buffer. Without {cmd}, start an +:te[rminal][!] [cmd] Run [cmd] in a non-interactive 'shell' in a new + |terminal-emulator| buffer. Without [cmd], start an interactive 'shell'. + By default the current window is used. To open in + a split window, use |:horizontal| or |:vertical|: > + :hor te + :vert te +< Type |i| to enter |Terminal-mode|, then keys are sent to the job running in the terminal. Type <C-\><C-N> to leave Terminal-mode. |CTRL-\_CTRL-N|. Type <C-\><C-O> @@ -260,7 +265,7 @@ gx Opens the current filepath or URL (decided by Fails if changes have been made to the current buffer, unless 'hidden' is set. - If {cmd} is omitted, and the 'shell' job exits with no + If [cmd] is omitted, and the 'shell' job exits with no error, the buffer is closed automatically |default-autocmds|. diff --git a/runtime/doc/vimeval.txt b/runtime/doc/vimeval.txt @@ -3774,7 +3774,7 @@ This is not allowed when the textlock is active: - etc. ============================================================================== -Vim script library *vim-script-library* +Vim script library *vimscript-library* Vim comes bundled with a Vim script library, that can be used by runtime, script authors. Currently, it only includes very few functions, but it may diff --git a/runtime/doc/vimfn.txt b/runtime/doc/vimfn.txt @@ -2098,35 +2098,35 @@ expand({string} [, {nosuf} [, {list}]]) *expand()* done like for the |cmdline-special| variables with their associated modifiers. Here is a short overview: - % current file name - # alternate file name - #n alternate file name n - <cfile> file name under the cursor - <afile> autocmd file name - <abuf> autocmd buffer number (as a String!) - <amatch> autocmd matched name + % Current file name + # Alternate file name + #n Alternate file name n + <cfile> File name under the cursor + <afile> Autocmd file name + <abuf> Autocmd buffer number (as a String!) + <amatch> Autocmd matched name <cexpr> C expression under the cursor - <sfile> deprecated, use <script> or <stack> - <slnum> sourced script line number or function + <sfile> Deprecated, use <script> or <stack> + <slnum> Sourced script line number or function line number - <sflnum> script file line number, also when in + <sflnum> Script file line number, also when in a function <SID> "<SNR>123_" where "123" is the current script ID |<SID>| - <script> sourced script file, or script file + <script> Sourced script file, or script file where the current function was defined. - Use |debug.getinfo()| in Lua scripts. - <stack> call stack - <cword> word under the cursor + For Lua see |lua-script-location|. + <stack> Call stack + <cword> Word under the cursor <cWORD> WORD under the cursor - <client> the {clientid} of the last received + <client> The {clientid} of the last received message Modifiers: - :p expand to full path - :h head (last path component removed) - :t tail (last path component only) - :r root (one extension removed) - :e extension only + :p Expand to full path + :h Head (last path component removed) + :t Tail (last path component only) + :r Root (one extension removed) + :e Extension only Example: >vim let &tags = expand("%:p:h") .. "/tags" diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt @@ -257,8 +257,8 @@ and 'winminwidth' are relevant. *:hor* *:horizontal* :hor[izontal] {cmd} - Execute {cmd}. Currently only makes a difference for - the following commands: + Execute {cmd} in a horizontal split window. Supports these + commands: - `:wincmd =`: equalize windows only horizontally. - |:terminal|: open a |terminal| buffer in a split window. - |:checkhealth|: open a healthcheck buffer in a split window. diff --git a/runtime/lua/vim/_core/server.lua b/runtime/lua/vim/_core/server.lua @@ -1,17 +1,18 @@ local M = {} ---- Called by builtin serverlist(). Returns all running servers. ---- in stdpath("run"). Does not include named pipes or TCP servers. +--- Called by builtin serverlist(). Returns all running servers in stdpath("run"). +--- +--- - TODO: track TCP servers, somehow. +--- - TODO: support Windows named pipes. --- --- @param listed string[] Already listed servers ---- @return string[] A list of currently running servers in stdpath("run") +--- @return string[] # List of servers found on the current machine in stdpath("run"). function M.serverlist(listed) - -- TODO: also get named pipes on Windows local socket_paths = vim.fs.find(function(name, _) return name:match('nvim.*') end, { path = vim.fn.stdpath('run'), type = 'socket', limit = math.huge }) - local running_sockets = {} + local found = {} ---@type string[] for _, socket in ipairs(socket_paths) do -- Don't list servers twice if not vim.list_contains(listed, socket) then @@ -20,14 +21,14 @@ function M.serverlist(listed) -- Check that the server is responding -- TODO: do we need a timeout or error handling here? if vim.fn.rpcrequest(chan, 'nvim_get_chan_info', 0).id then - table.insert(running_sockets, socket) + table.insert(found, socket) end vim.fn.chanclose(chan) end end end - return running_sockets + return found end return M diff --git a/runtime/lua/vim/_meta/api.lua b/runtime/lua/vim/_meta/api.lua @@ -2045,6 +2045,10 @@ function vim.api.nvim_put(lines, type, after, follow) end --- Replaces terminal codes and `keycodes` ([<CR>], [<Esc>], ...) in a string with --- the internal representation. --- +--- +--- Note: +--- Lua can use |vim.keycode()| instead. +--- --- @see replace_termcodes --- @see cpoptions --- @param str string String to be converted. diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua @@ -2239,7 +2239,8 @@ vim.bo.et = vim.bo.expandtab --- Unset 'exrc' to stop further searching of 'exrc' files in parent --- directories, similar to `editorconfig.root`. --- ---- To get its own location, Lua exrc files can use `debug.getinfo()`. +--- To get its own location, a Lua exrc file can use `debug.getinfo()`. +--- See `lua-script-location`. --- --- Compare 'exrc' to `editorconfig`: --- - 'exrc' can execute any code; editorconfig only specifies settings. @@ -2251,7 +2252,7 @@ vim.bo.et = vim.bo.expandtab --- 3. Create ".nvim.lua" in your project root directory with this line: --- --- ```lua ---- vim.cmd[[set runtimepath+=.nvim]] +--- vim.cmd[[set runtimepath+=.nvim]] --- ``` --- --- This option cannot be set from a `modeline` or in the `sandbox`, for diff --git a/runtime/lua/vim/_meta/vimfn.lua b/runtime/lua/vim/_meta/vimfn.lua @@ -1855,35 +1855,35 @@ function vim.fn.exp(expr) end --- done like for the |cmdline-special| variables with their --- associated modifiers. Here is a short overview: --- ---- % current file name ---- # alternate file name ---- #n alternate file name n ---- <cfile> file name under the cursor ---- <afile> autocmd file name ---- <abuf> autocmd buffer number (as a String!) ---- <amatch> autocmd matched name +--- % Current file name +--- # Alternate file name +--- #n Alternate file name n +--- <cfile> File name under the cursor +--- <afile> Autocmd file name +--- <abuf> Autocmd buffer number (as a String!) +--- <amatch> Autocmd matched name --- <cexpr> C expression under the cursor ---- <sfile> deprecated, use <script> or <stack> ---- <slnum> sourced script line number or function +--- <sfile> Deprecated, use <script> or <stack> +--- <slnum> Sourced script line number or function --- line number ---- <sflnum> script file line number, also when in +--- <sflnum> Script file line number, also when in --- a function --- <SID> "<SNR>123_" where "123" is the --- current script ID |<SID>| ---- <script> sourced script file, or script file +--- <script> Sourced script file, or script file --- where the current function was defined. ---- Use |debug.getinfo()| in Lua scripts. ---- <stack> call stack ---- <cword> word under the cursor +--- For Lua see |lua-script-location|. +--- <stack> Call stack +--- <cword> Word under the cursor --- <cWORD> WORD under the cursor ---- <client> the {clientid} of the last received +--- <client> The {clientid} of the last received --- message --- Modifiers: ---- :p expand to full path ---- :h head (last path component removed) ---- :t tail (last path component only) ---- :r root (one extension removed) ---- :e extension only +--- :p Expand to full path +--- :h Head (last path component removed) +--- :t Tail (last path component only) +--- :r Root (one extension removed) +--- :e Extension only --- --- Example: >vim --- let &tags = expand("%:p:h") .. "/tags" diff --git a/runtime/lua/vim/_system.lua b/runtime/lua/vim/_system.lua @@ -471,6 +471,10 @@ end --- Runs a system command or throws an error if {cmd} cannot be run. --- +--- The command runs directly (not in 'shell') so shell builtins such as "echo" in cmd.exe, cmdlets +--- in powershell, or "help" in bash, will not work unless you actually invoke a shell: +--- `vim.system({'bash', '-c', 'help'})`. +--- --- Examples: --- --- ```lua diff --git a/runtime/lua/vim/net.lua b/runtime/lua/vim/net.lua @@ -40,17 +40,11 @@ function M.request(url, opts, on_response) table.insert(args, url) local function on_exit(res) - local err_msg = nil - local response = nil - - if res.code ~= 0 then - err_msg = (res.stderr ~= '' and res.stderr) - or string.format('Request failed with exit code %d', res.code) - else - response = { - body = opts.outpath and true or res.stdout, - } - end + local s = 'Request failed with exit code %d' + local err_msg = res.code ~= 0 + and ((res.stderr ~= '' and res.stderr) or string.format(s, res.code)) + or nil + local response = res.code == 0 and { body = opts.outpath and true or res.stdout } or nil if on_response then on_response(err_msg, response) diff --git a/runtime/lua/vim/secure.lua b/runtime/lua/vim/secure.lua @@ -121,16 +121,20 @@ function M.read(path) return contents end - local dir_msg = ' To enable it, choose (v)iew then run `:trust`.' + local msg2 = ' To enable it, choose (v)iew then run `:trust`:' local choices = '&ignore\n&view\n&deny' if hash == 'directory' then - dir_msg = ' DIRECTORY trust is decided only by its name, not its contents.' + msg2 = ' DIRECTORY trust is decided only by name, not contents:' choices = '&ignore\n&view\n&deny\n&allow' end -- File either does not exist in trust database or the hash does not match - local ok, result = - pcall(vim.fn.confirm, string.format('%s is not trusted.%s', fullpath, dir_msg), choices, 1) + local ok, result = pcall( + vim.fn.confirm, + string.format('exrc: Found untrusted code.%s\n%s', msg2, fullpath), + choices, + 1 + ) if not ok and result ~= 'Keyboard interrupt' then error(result) diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua @@ -1104,7 +1104,7 @@ do err_msg = is_valid(name, value, validator, msg, false) end elseif type(name) == 'table' then -- Form 2 - vim.deprecate('vim.validate', 'vim.validate(name, value, validator, optional_or_msg)', '1.0') + vim.deprecate('vim.validate{<table>}', 'vim.validate(<params>)', '1.0') err_msg = validate_spec(name) else error('invalid arguments') diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua @@ -1163,9 +1163,8 @@ end --- Opens a live editor to query the buffer you started from. --- ---- Can also be shown with `:EditQuery`. [:EditQuery]() ---- ---- `:EditQuery <tab>` completes the treesitter parser names in the runtime path. +--- Can also be shown with the [:EditQuery]() command. `:EditQuery <tab>` completes available +--- parsers. --- --- If you move the cursor to a capture name ("@foo"), text matching the capture is highlighted in --- the source buffer. The query editor is a scratch buffer, use `:write` to save it. You can find diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh @@ -207,7 +207,7 @@ preprocess_patch() { 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/runtime/\<\%('"${na_rt}"'\)\>@exe "norm! d/\\v(^diff)|%$\r"' +w +q "$file" # Remove unwanted Vim doc files. - local na_doc='channel\.txt\|if_cscop\.txt\|netbeans\.txt\|os_\w\+\.txt\|print\.txt\|term\.txt\|todo\.txt\|vim9\.txt\|tags' + local na_doc='channel\.txt\|if_cscop\.txt\|netbeans\.txt\|os_\w\+\.txt\|print\.txt\|term\.txt\|testing\.txt\|todo\.txt\|vim9\.txt\|tags' 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/runtime/doc/\<\%('"${na_doc}"'\)\>@exe "norm! d/\\v(^diff)|%$\r"' +w +q "$file" # Remove "Last change ..." changes in doc files. diff --git a/src/gen/gen_help_html.lua b/src/gen/gen_help_html.lua @@ -79,6 +79,7 @@ local new_layout = { ['news-0.10.txt'] = true, ['news-0.11.txt'] = true, ['nvim.txt'] = true, + ['pack.txt'] = true, ['provider.txt'] = true, ['tui.txt'] = true, ['ui.txt'] = true, diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c @@ -466,12 +466,14 @@ error: /// Replaces terminal codes and |keycodes| ([<CR>], [<Esc>], ...) in a string with /// the internal representation. /// +/// @note Lua can use |vim.keycode()| instead. +/// @see replace_termcodes +/// @see cpoptions +/// /// @param str String to be converted. /// @param from_part Legacy Vim parameter. Usually true. /// @param do_lt Also translate [<lt>]. Ignored if `special` is false. /// @param special Replace |keycodes|, e.g. [<CR>] becomes a "\r" char. -/// @see replace_termcodes -/// @see cpoptions String nvim_replace_termcodes(String str, Boolean from_part, Boolean do_lt, Boolean special) FUNC_API_SINCE(1) FUNC_API_RET_ALLOC { diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua @@ -2405,35 +2405,35 @@ M.funcs = { done like for the |cmdline-special| variables with their associated modifiers. Here is a short overview: - % current file name - # alternate file name - #n alternate file name n - <cfile> file name under the cursor - <afile> autocmd file name - <abuf> autocmd buffer number (as a String!) - <amatch> autocmd matched name + % Current file name + # Alternate file name + #n Alternate file name n + <cfile> File name under the cursor + <afile> Autocmd file name + <abuf> Autocmd buffer number (as a String!) + <amatch> Autocmd matched name <cexpr> C expression under the cursor - <sfile> deprecated, use <script> or <stack> - <slnum> sourced script line number or function + <sfile> Deprecated, use <script> or <stack> + <slnum> Sourced script line number or function line number - <sflnum> script file line number, also when in + <sflnum> Script file line number, also when in a function <SID> "<SNR>123_" where "123" is the current script ID |<SID>| - <script> sourced script file, or script file + <script> Sourced script file, or script file where the current function was defined. - Use |debug.getinfo()| in Lua scripts. - <stack> call stack - <cword> word under the cursor + For Lua see |lua-script-location|. + <stack> Call stack + <cword> Word under the cursor <cWORD> WORD under the cursor - <client> the {clientid} of the last received + <client> The {clientid} of the last received message Modifiers: - :p expand to full path - :h head (last path component removed) - :t tail (last path component only) - :r root (one extension removed) - :e extension only + :p Expand to full path + :h Head (last path component removed) + :t Tail (last path component only) + :r Root (one extension removed) + :e Extension only Example: >vim let &tags = expand("%:p:h") .. "/tags" diff --git a/src/nvim/globals.h b/src/nvim/globals.h @@ -421,20 +421,20 @@ EXTERN int sc_col; // column for shown command // First NO_SCREEN, then NO_BUFFERS, then 0 when startup finished. EXTERN int starting INIT( = NO_SCREEN); -// true when planning to exit. Might keep running if there is a changed buffer. +// Planning to exit. Might keep running if there is a changed buffer. EXTERN bool exiting INIT( = false); -// true when planning to restart. +// Planning to restart. EXTERN bool restarting INIT( = false); -// internal value of v:dying +// Internal value of v:dying EXTERN int v_dying INIT( = 0); -// is stdin a terminal? +// Is stdin a terminal? EXTERN bool stdin_isatty INIT( = true); -// is stdout a terminal? +// Is stdout a terminal? EXTERN bool stdout_isatty INIT( = true); -// is stderr a terminal? +// Is stderr a terminal? EXTERN bool stderr_isatty INIT( = true); -/// filedesc set by embedder for reading first buffer like `cmd | nvim -` +/// Filedesc set by embedder for reading first buffer like `cmd | nvim -`. EXTERN int stdin_fd INIT( = -1); // true when doing full-screen output, otherwise only writing some messages. diff --git a/src/nvim/lua/secure.c b/src/nvim/lua/secure.c @@ -78,11 +78,11 @@ static bool nlua_trust(const char *action, const char *path) if (msg != NULL) { if (success) { if (strcmp(action, "allow") == 0) { - smsg(0, "Allowed \"%s\" in trust database.", msg); + smsg(0, "Allowed in trust database: \"%s\"", msg); } else if (strcmp(action, "deny") == 0) { - smsg(0, "Denied \"%s\" in trust database.", msg); + smsg(0, "Denied in trust database: \"%s\"", msg); } else if (strcmp(action, "remove") == 0) { - smsg(0, "Removed \"%s\" from trust database.", msg); + smsg(0, "Removed from trust database: \"%s\"", msg); } } else { semsg(e_trustfile, msg); diff --git a/src/nvim/options.lua b/src/nvim/options.lua @@ -2847,7 +2847,8 @@ local options = { Unset 'exrc' to stop further searching of 'exrc' files in parent directories, similar to |editorconfig.root|. - To get its own location, Lua exrc files can use |debug.getinfo()|. + To get its own location, a Lua exrc file can use |debug.getinfo()|. + See |lua-script-location|. Compare 'exrc' to |editorconfig|: - 'exrc' can execute any code; editorconfig only specifies settings. @@ -2857,7 +2858,7 @@ local options = { 1. Enable 'exrc'. 2. Place LSP configs at ".nvim/lsp/*.lua" in your project root. 3. Create ".nvim.lua" in your project root directory with this line: >lua - vim.cmd[[set runtimepath+=.nvim]] + vim.cmd[[set runtimepath+=.nvim]] < This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. diff --git a/test/functional/core/server_spec.lua b/test/functional/core/server_spec.lua @@ -187,22 +187,20 @@ describe('server', function() -- After serverstop() the servers should NOT be in the list. eq(_n, eval('len(serverlist())')) - -- serverlist({ peer = true }) returns servers from other Nvim sessions. + -- serverlist({peer=true}) returns servers from other Nvim sessions. if t.is_os('win') then return end - local client_address = n.new_pipename() - local client = n.new_session( - true, - { args = { '-u', 'NONE', '--listen', client_address, '--embed' }, merge = false } - ) + local peer_addr = n.new_pipename() + local client = + n.new_session(true, { args = { '--clean', '--listen', peer_addr, '--embed' }, merge = false }) n.set_session(client) - eq(client_address, fn.serverlist()[1]) + eq(peer_addr, fn.serverlist()[1]) n.set_session(current_server) new_servs = fn.serverlist({ peer = true }) - eq(true, vim.list_contains(new_servs, client_address)) + eq(true, vim.list_contains(new_servs, peer_addr)) client:close() end) end) diff --git a/test/functional/core/startup_spec.lua b/test/functional/core/startup_spec.lua @@ -1262,11 +1262,11 @@ describe('user config init', function() -- trust .exrc feed(':trust<CR>') - screen:expect({ any = 'Allowed ".*' .. pathsep .. '%.exrc" in trust database.' }) + screen:expect({ any = 'Allowed in trust database: ".*' .. pathsep .. '%.exrc"' }) feed(':q<CR>') -- trust .nvim.lua feed(':trust<CR>') - screen:expect({ any = 'Allowed ".*' .. pathsep .. '%.nvim%.lua" in trust database.' }) + screen:expect({ any = 'Allowed in trust database: ".*' .. pathsep .. '%.nvim%.lua"' }) feed(':q<CR>') -- no exrc file is executed feed(':echo g:exrc_count<CR>') diff --git a/test/functional/ex_cmds/trust_spec.lua b/test/functional/ex_cmds/trust_spec.lua @@ -35,15 +35,15 @@ describe(':trust', function() local hash = fn.sha256(t.read_file('test_file')) command('edit test_file') - matches('^Allowed ".*test_file" in trust database%.$', exec_capture('trust')) + matches('^Allowed in trust database%: ".*test_file"$', exec_capture('trust')) local trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format('%s %s', hash, cwd .. pathsep .. 'test_file'), vim.trim(trust)) - matches('^Denied ".*test_file" in trust database%.$', exec_capture('trust ++deny')) + matches('^Denied in trust database%: ".*test_file"$', exec_capture('trust ++deny')) trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format('! %s', cwd .. pathsep .. 'test_file'), vim.trim(trust)) - matches('^Removed ".*test_file" from trust database%.$', exec_capture('trust ++remove')) + matches('^Removed from trust database%: ".*test_file"$', exec_capture('trust ++remove')) trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format(''), vim.trim(trust)) end) @@ -53,15 +53,15 @@ describe(':trust', function() local hash = fn.sha256(t.read_file('test_file')) command('edit test_file') - matches('^Denied ".*test_file" in trust database%.$', exec_capture('trust ++deny')) + matches('^Denied in trust database%: ".*test_file"$', exec_capture('trust ++deny')) local trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format('! %s', cwd .. pathsep .. 'test_file'), vim.trim(trust)) - matches('^Allowed ".*test_file" in trust database%.$', exec_capture('trust')) + matches('^Allowed in trust database%: ".*test_file"$', exec_capture('trust')) trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format('%s %s', hash, cwd .. pathsep .. 'test_file'), vim.trim(trust)) - matches('^Removed ".*test_file" from trust database%.$', exec_capture('trust ++remove')) + matches('^Removed from trust database%: ".*test_file"$', exec_capture('trust ++remove')) trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format(''), vim.trim(trust)) end) @@ -69,12 +69,12 @@ describe(':trust', function() it('deny then remove a file using file path', function() local cwd = fn.getcwd() - matches('^Denied ".*test_file" in trust database%.$', exec_capture('trust ++deny test_file')) + matches('^Denied in trust database%: ".*test_file"$', exec_capture('trust ++deny test_file')) local trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') eq(string.format('! %s', cwd .. pathsep .. 'test_file'), vim.trim(trust)) matches( - '^Removed ".*test_file" from trust database%.$', + '^Removed from trust database%: ".*test_file"$', exec_capture('trust ++remove test_file') ) trust = t.read_file(fn.stdpath('state') .. pathsep .. 'trust') diff --git a/test/functional/lua/secure_spec.lua b/test/functional/lua/secure_spec.lua @@ -55,22 +55,18 @@ describe('vim.secure', function() }) local cwd = fn.getcwd() - local msg = cwd - .. pathsep - .. 'Xfile is not trusted. To enable it, choose (v)iew then run `:trust`.' - if #msg >= screen._width then - pending('path too long') - return - end + local msg = 'exrc: Found untrusted code. To enable it, choose (v)iew then run `:trust`:' + local path = ('%s%sXfile'):format(cwd, pathsep) -- Need to use feed_command instead of exec_lua because of the confirmation prompt feed_command([[lua vim.secure.read('Xfile')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xfile'){MATCH: +}| - {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. msg .. [[}{MATCH: *}| + {3:]] .. path .. [[}{MATCH: *}| {3:[i]gnore, (v)iew, (d)eny: }^{MATCH: +}| ]]) feed('d') @@ -89,10 +85,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xfile')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xfile'){MATCH: +}| - {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. msg .. [[}{MATCH: *}| + {3:]] .. path .. [[}{MATCH: *}| {3:[i]gnore, (v)iew, (d)eny: }^{MATCH: +}| ]]) feed('v') @@ -104,7 +101,7 @@ describe('vim.secure', function() {MATCH: +}| {1:~{MATCH: +}}| {4:[No Name]{MATCH: +}}| - Allowed "]] .. cwd .. pathsep .. [[Xfile" in trust database.{MATCH: +}| + Allowed in trust database: "]] .. cwd .. pathsep .. [[Xfile"{MATCH: +}| ]]) -- close the split for the next test below. feed(':q<CR>') @@ -119,10 +116,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xfile')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xfile'){MATCH: +}| - {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. msg .. [[}{MATCH: *}| + {3:]] .. path .. [[}{MATCH: *}| {3:[i]gnore, (v)iew, (d)eny: }^{MATCH: +}| ]]) feed('i') @@ -138,10 +136,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xfile')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xfile'){MATCH: +}| {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. path .. [[}{MATCH: *}| {3:[i]gnore, (v)iew, (d)eny: }^{MATCH: +}| ]]) feed('v') @@ -172,22 +171,19 @@ describe('vim.secure', function() }) local cwd = fn.getcwd() - local msg = cwd - .. pathsep - .. 'Xdir is not trusted. DIRECTORY trust is decided only by its name, not its contents.' - if #msg >= screen._width then - pending('path too long') - return - end + local msg = + 'exrc: Found untrusted code. DIRECTORY trust is decided only by name, not contents:' + local path = ('%s%sXdir'):format(cwd, pathsep) -- Need to use feed_command instead of exec_lua because of the confirmation prompt feed_command([[lua vim.secure.read('Xdir')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xdir'){MATCH: +}| {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. path .. [[}{MATCH: +}| {3:[i]gnore, (v)iew, (d)eny, (a)llow: }^{MATCH: +}| ]]) feed('d') @@ -206,10 +202,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xdir')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xdir'){MATCH: +}| {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. path .. [[}{MATCH: +}| {3:[i]gnore, (v)iew, (d)eny, (a)llow: }^{MATCH: +}| ]]) feed('a') @@ -231,10 +228,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xdir')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xdir'){MATCH: +}| {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. path .. [[}{MATCH: +}| {3:[i]gnore, (v)iew, (d)eny, (a)llow: }^{MATCH: +}| ]]) feed('i') @@ -250,10 +248,11 @@ describe('vim.secure', function() feed_command([[lua vim.secure.read('Xdir')]]) screen:expect([[ {MATCH: +}| - {1:~{MATCH: +}}|*3 + {1:~{MATCH: +}}|*2 {2:{MATCH: +}}| :lua vim.secure.read('Xdir'){MATCH: +}| {3:]] .. msg .. [[}{MATCH: +}| + {3:]] .. path .. [[}{MATCH: +}| {3:[i]gnore, (v)iew, (d)eny, (a)llow: }^{MATCH: +}| ]]) feed('v')