aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/doc/eval.txt21
-rw-r--r--runtime/filetype.vim8
-rw-r--r--runtime/lua/vim/lsp.lua73
-rw-r--r--runtime/lua/vim/lsp/util.lua1
4 files changed, 82 insertions, 21 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index c3736d9a3e..cff87b2fed 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -5361,9 +5361,8 @@ input({opts})
prompt "" Same as {prompt} in the first form.
default "" Same as {text} in the first form.
completion nothing Same as {completion} in the first form.
- cancelreturn "" Same as {cancelreturn} from
- |inputdialog()|. Also works with
- input().
+ cancelreturn "" The value returned when the dialog is
+ cancelled.
highlight nothing Highlight handler: |Funcref|.
The highlighting set with |:echohl| is used for the prompt.
@@ -10099,6 +10098,8 @@ This function can then be called with: >
The recursiveness of user functions is restricted with the |'maxfuncdepth'|
option.
+It is also possible to use `:eval`. It does not support a range.
+
AUTOMATICALLY LOADING FUNCTIONS ~
*autoload-functions*
@@ -10532,6 +10533,20 @@ text...
Unlock the internal variable {name}. Does the
opposite of |:lockvar|.
+ *:eval*
+:eval {expr} Evaluate {expr} and discard the result. Example: >
+ :eval append(Filter(Getlist()), '$')
+
+< The expression is supposed to have a side effect,
+ since the resulting value is not used. In the example
+ the `append()` call appends the List with text to the
+ buffer. This is similar to `:call` but works with any
+ expression.
+
+ The command can be shortened to `:ev` or `:eva`, but
+ these are hard to recognize and therefore not to be
+ used.
+
:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
:en[dif] Execute the commands until the next matching ":else"
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index b7157a14e7..7bfe048bbf 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -413,6 +413,10 @@ endif
" Lynx config files
au BufNewFile,BufRead lynx.cfg setf lynx
+" Modula-3 configuration language (must be before *.cfg and *makefile)
+au BufNewFile,BufRead *.quake,cm3.cfg setf m3quake
+au BufNewFile,BufRead m3makefile,m3overrides setf m3build
+
" Quake
au BufNewFile,BufRead *baseq[2-3]/*.cfg,*id1/*.cfg setf quake
au BufNewFile,BufRead *quake[1-3]/*.cfg setf quake
@@ -1041,10 +1045,10 @@ au BufNewFile,BufRead *.mod
\ setf modsim3 |
\ endif
-" Modula 2 (.md removed in favor of Markdown)
+" Modula-2 (.md removed in favor of Markdown)
au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.mi setf modula2
-" Modula 3 (.m3, .i3, .mg, .ig)
+" Modula-3 (.m3, .i3, .mg, .ig)
au BufNewFile,BufRead *.[mi][3g] setf modula3
" Monk
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
index 59b7180cf1..cb3d4bbe9f 100644
--- a/runtime/lua/vim/lsp.lua
+++ b/runtime/lua/vim/lsp.lua
@@ -267,14 +267,20 @@ end
--@private
--- Memoizes a function. On first run, the function return value is saved and
---- immediately returned on subsequent runs.
+--- immediately returned on subsequent runs. If the function returns a multival,
+--- only the first returned value will be memoized and returned. The function will only be run once,
+--- even if it has side-effects.
---
--@param fn (function) Function to run
--@returns (function) Memoized function
local function once(fn)
local value
+ local ran = false
return function(...)
- if not value then value = fn(...) end
+ if not ran then
+ value = fn(...)
+ ran = true
+ end
return value
end
end
@@ -1239,9 +1245,49 @@ function lsp.buf_request(bufnr, method, params, handler)
return client_request_ids, _cancel_all_requests
end
---- Sends a request to a server and waits for the response.
+---Sends an async request for all active clients attached to the buffer.
+---Executes the callback on the combined result.
+---Parameters are the same as |vim.lsp.buf_request()| but the return result and callback are
+---different.
+---
+--@param bufnr (number) Buffer handle, or 0 for current.
+--@param method (string) LSP method name
+--@param params (optional, table) Parameters to send to the server
+--@param callback (function) The callback to call when all requests are finished.
+-- Unlike `buf_request`, this will collect all the responses from each server instead of handling them.
+-- A map of client_id:request_result will be provided to the callback
+--
+--@returns (function) A function that will cancel all requests which is the same as the one returned from `buf_request`.
+function lsp.buf_request_all(bufnr, method, params, callback)
+ local request_results = {}
+ local result_count = 0
+ local expected_result_count = 0
+ local cancel, client_request_ids
+
+ local set_expected_result_count = once(function()
+ for _ in pairs(client_request_ids) do
+ expected_result_count = expected_result_count + 1
+ end
+ end)
+
+ local function _sync_handler(err, _, result, client_id)
+ request_results[client_id] = { error = err, result = result }
+ result_count = result_count + 1
+ set_expected_result_count()
+
+ if result_count >= expected_result_count then
+ callback(request_results)
+ end
+ end
+
+ client_request_ids, cancel = lsp.buf_request(bufnr, method, params, _sync_handler)
+
+ return cancel
+end
+
+--- Sends a request to all server and waits for the response of all of them.
---
---- Calls |vim.lsp.buf_request()| but blocks Nvim while awaiting the result.
+--- Calls |vim.lsp.buf_request_all()| but blocks Nvim while awaiting the result.
--- Parameters are the same as |vim.lsp.buf_request()| but the return result is
--- different. Wait maximum of {timeout_ms} (default 100) ms.
---
@@ -1255,26 +1301,21 @@ end
--- returns `(nil, err)` where `err` is a string describing the failure
--- reason.
function lsp.buf_request_sync(bufnr, method, params, timeout_ms)
- local request_results = {}
- local result_count = 0
- local function _sync_handler(err, _, result, client_id)
- request_results[client_id] = { error = err, result = result }
- result_count = result_count + 1
- end
- local client_request_ids, cancel = lsp.buf_request(bufnr, method, params, _sync_handler)
- local expected_result_count = 0
- for _ in pairs(client_request_ids) do
- expected_result_count = expected_result_count + 1
- end
+ local request_results
+
+ local cancel = lsp.buf_request_all(bufnr, method, params, function(it)
+ request_results = it
+ end)
local wait_result, reason = vim.wait(timeout_ms or 100, function()
- return result_count >= expected_result_count
+ return request_results ~= nil
end, 10)
if not wait_result then
cancel()
return nil, wait_result_reason[reason]
end
+
return request_results
end
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 28a669778a..71ec85381b 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -470,6 +470,7 @@ function M.apply_text_document_edit(text_document_edit, index)
-- `VersionedTextDocumentIdentifier`s version may be null
-- https://microsoft.github.io/language-server-protocol/specification#versionedTextDocumentIdentifier
if should_check_version and (text_document.version
+ and text_document.version > 0
and M.buf_versions[bufnr]
and M.buf_versions[bufnr] > text_document.version) then
print("Buffer ", text_document.uri, " newer than edits.")