aboutsummaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/doc/lsp.txt4
-rw-r--r--runtime/doc/quickfix.txt17
-rw-r--r--runtime/lua/vim/lsp/rpc.lua28
3 files changed, 33 insertions, 16 deletions
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index 5747ba6044..78829fbba1 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -1062,9 +1062,9 @@ get_count({bufnr}, {severity}, {client_id})
let sl = ''
if luaeval('not vim.tbl_isempty(vim.lsp.buf_get_clients(0))')
let sl.='%#MyStatuslineLSP#E:'
- let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count([[Error]])")}'
+ let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.diagnostic.get_count(vim.fn.bufnr('%'), [[Error]])")}'
let sl.='%#MyStatuslineLSP# W:'
- let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count([[Warning]])")}'
+ let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.diagnostic.get_count(vim.fn.bufnr('%'), [[Warning]])")}'
else
let sl.='%#MyStatuslineLSPErrors#off'
endif
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index 9da11a553d..d6ff3ea9ea 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -187,12 +187,17 @@ processing a quickfix or location list command, it will be aborted.
current window is used instead of the quickfix list.
*:cq* *:cquit*
-:[count]cq[uit] Quit Nvim with an error code, or the code specified in
- [count]. Useful when Nvim is called from another
- program: e.g. `git commit` will abort the comitting
- process, `fc` (built-in for shells like bash and zsh)
- will not execute the command.
-
+:cq[uit][!]
+:{N}cq[uit][!]
+:cq[uit][!] {N} Quit Vim with error code {N}. {N} defaults to one.
+ Useful when Vim is called from another program:
+ e.g., a compiler will not compile the same file again,
+ `git commit` will abort the committing process, `fc`
+ (built-in for shells like bash and zsh) will not
+ execute the command, etc. will not compile the same
+ file again.
+ {N} can also be zero, in which case Vim exits
+ normally.
WARNING: All changes in files are lost. It works like
":qall!" |:qall|, except that Nvim exits non-zero or
[count].
diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua
index bbcc8ea6f9..90f51dfc5a 100644
--- a/runtime/lua/vim/lsp/rpc.lua
+++ b/runtime/lua/vim/lsp/rpc.lua
@@ -139,7 +139,7 @@ local header_start_pattern = ("content"):gsub("%w", function(c) return "["..c..c
--@private
--- The actual workhorse.
local function request_parser_loop()
- local buffer = ''
+ local buffer = '' -- only for header part
while true do
-- A message can only be complete if it has a double CRLF and also the full
-- payload, so first let's check for the CRLFs
@@ -154,17 +154,29 @@ local function request_parser_loop()
-- TODO(ashkan) I'd like to remove this, but it seems permanent :(
local buffer_start = buffer:find(header_start_pattern)
local headers = parse_headers(buffer:sub(buffer_start, start-1))
- buffer = buffer:sub(finish+1)
local content_length = headers.content_length
+ -- Use table instead of just string to buffer the message. It prevents
+ -- a ton of strings allocating.
+ -- ref. http://www.lua.org/pil/11.6.html
+ local body_chunks = {buffer:sub(finish+1)}
+ local body_length = #body_chunks[1]
-- Keep waiting for data until we have enough.
- while #buffer < content_length do
- buffer = buffer..(coroutine.yield()
- or error("Expected more data for the body. The server may have died.")) -- TODO hmm.
+ while body_length < content_length do
+ local chunk = coroutine.yield()
+ or error("Expected more data for the body. The server may have died.") -- TODO hmm.
+ table.insert(body_chunks, chunk)
+ body_length = body_length + #chunk
end
- local body = buffer:sub(1, content_length)
- buffer = buffer:sub(content_length + 1)
+ local last_chunk = body_chunks[#body_chunks]
+
+ body_chunks[#body_chunks] = last_chunk:sub(1, content_length - body_length - 1)
+ local rest = ''
+ if body_length > content_length then
+ rest = last_chunk:sub(content_length - body_length)
+ end
+ local body = table.concat(body_chunks)
-- Yield our data.
- buffer = buffer..(coroutine.yield(headers, body)
+ buffer = rest..(coroutine.yield(headers, body)
or error("Expected more data for the body. The server may have died.")) -- TODO hmm.
else
-- Get more data since we don't have enough.