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

This commit is contained in:
Justin M. Keyes
2025-07-28 22:23:07 -04:00
committed by GitHub
39 changed files with 330 additions and 322 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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}

View File

@@ -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

View File

@@ -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

View File

@@ -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).
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).
When an LSP client starts, it resolves its configuration by merging from the
following (in increasing priority):
*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('*', {

View File

@@ -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)

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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).

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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|.

View File

@@ -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

View File

@@ -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"

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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')

View File

@@ -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

View File

@@ -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.

View File

@@ -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,

View File

@@ -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
{

View File

@@ -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"

View File

@@ -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.

View File

@@ -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);

View File

@@ -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.

View File

@@ -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)

View File

@@ -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>')

View File

@@ -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')

View File

@@ -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')