aboutsummaryrefslogtreecommitdiffstats
path: root/lua/common_lsp/texlab.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/common_lsp/texlab.lua')
-rw-r--r--lua/common_lsp/texlab.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/lua/common_lsp/texlab.lua b/lua/common_lsp/texlab.lua
new file mode 100644
index 00000000..a0d8bd4f
--- /dev/null
+++ b/lua/common_lsp/texlab.lua
@@ -0,0 +1,89 @@
+local api = vim.api
+local validate = vim.validate
+local util = require 'common_lsp/util'
+local lsp = vim.lsp
+
+local M = {}
+
+local texlab_build_status = vim.tbl_add_reverse_lookup {
+ Success = 0;
+ Error = 1;
+ Failure = 2;
+ Cancelled = 3;
+}
+
+function M.texlab_buf_build(bufnr)
+ bufnr = util.validate_bufnr(bufnr)
+ local params = { textDocument = { uri = vim.uri_from_bufnr(bufnr) } }
+ lsp.buf_request(bufnr, 'textDocument/build', params, function(err, method, result, client_id)
+ if err then error(tostring(err)) end
+ print("Build "..texlab_build_status[result.status])
+ end)
+end
+
+-- bufnr isn't actually required here, but we need a valid buffer in order to
+-- be able to find the client for buf_request.
+-- TODO find a client by looking through buffers for a valid client?
+function M.texlab_build_cancel_all(bufnr)
+ bufnr = util.validate_bufnr(bufnr)
+ local params = { token = "texlab-build-*" }
+ lsp.buf_request(bufnr, 'window/progress/cancel', params, function(err, method, result, client_id)
+ if err then error(tostring(err)) end
+ print("Cancel result", vim.inspect(result))
+ end)
+end
+
+-- TODO support more of https://github.com/microsoft/vscode-languageserver-node/blob/master/protocol/src/protocol.progress.proposed.md
+
+local default_config
+default_config = {
+ name = "texlab";
+ cmd = {"texlab"};
+ filetype = {"tex"};
+ build_log_level = lsp.protocol.MessageType.Warning;
+ build_args = {"-pdf", "-interaction=nonstopmode", "-synctex=1"};
+ build_executable = "latexmk";
+ build_on_save = false;
+ callbacks = {
+ ["window/logMessage"] = function(err, method, params, client_id)
+ local client = lsp.get_client_by_id(client_id)
+ -- TODO(ashkan) If the client died, then we might as well show everything?
+ local build_log_level = client and client.config.build_log_level or lsp.protocol.MessageType.Log
+ -- local build_log_level = client and client.config.build_log_level or default_config.build_log_level
+ if params and params.type <= build_log_level then
+ lsp.builtin_callbacks[method](err, method, params, client_id)
+ end
+ end
+ }
+}
+
+local function run_command(command)
+ validate { command = { command, 's' } }
+ for line in vim.gsplit(command, "\n", true) do
+ api.nvim_command(line)
+ end
+end
+
+function M.texlab(config)
+ config = vim.tbl_extend("keep", config, default_config)
+ -- Deep merge is needed for callbacks.
+ for method, fn in pairs(default_config.callbacks) do
+ config.callbacks[method] = fn
+ end
+ config.on_attach = util.add_hook_after(config.on_attach, function(client, bufnr)
+ if bufnr == api.nvim_get_current_buf() then
+ M.texlab_setup_commands()
+ else
+ run_command(string.format("autocmd BufEnter <buffer=%d> ++once lua require'common_lsp/texlab'.texlab_setup_commands()", bufnr))
+ end
+ end)
+ lsp.add_filetype_config(config)
+end
+
+function M.texlab_setup_commands()
+ run_command [[
+ command! TexlabBuild lua require'common_lsp/texlab'.texlab_buf_build(0)
+ ]]
+end
+
+return M