diff options
| author | Micah Halter <micah.halter@gtri.gatech.edu> | 2024-10-01 07:50:16 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-01 04:50:16 -0700 |
| commit | 291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9 (patch) | |
| tree | fc66a57389720f1c520cd4a3cd5cb19ae6bec356 /lua | |
| parent | fix(ci): allow "vim.fs.dirname" (diff) | |
| download | nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar.gz nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar.bz2 nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar.lz nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar.xz nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.tar.zst nvim-lspconfig-291e85e26585ac9f03df6eaa0d81b9cdcd0a7eb9.zip | |
feat(julials): JuliaActivateEnv command #3318
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/lspconfig/server_configurations/julials.lua | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/lua/lspconfig/server_configurations/julials.lua b/lua/lspconfig/server_configurations/julials.lua index 44360c71..8788ffc4 100644 --- a/lua/lspconfig/server_configurations/julials.lua +++ b/lua/lspconfig/server_configurations/julials.lua @@ -1,5 +1,58 @@ local util = require 'lspconfig.util' +local root_files = { 'Project.toml', 'JuliaProject.toml' } + +local function activate_env(path) + assert(vim.fn.has 'nvim-0.10' == 1, 'requires Nvim 0.10 or newer') + local bufnr = vim.api.nvim_get_current_buf() + local julials_clients = vim.lsp.get_clients { bufnr = bufnr, name = 'julials' } + assert( + #julials_clients == 0, + 'method julia/activateenvironment is not supported by any servers active on the current buffer' + ) + local function _activate_env(environment) + if environment then + for _, julials_client in ipairs(julials_clients) do + julials_client.notify('julia/activateenvironment', { envPath = environment }) + end + vim.notify('Julia environment activated: \n`' .. environment .. '`', vim.log.levels.INFO) + end + end + if path then + path = vim.fs.normalize(vim.fn.fnamemodify(vim.fn.expand(path), ':p')) + local found_env = false + for _, project_file in ipairs(root_files) do + local file = vim.uv.fs_stat(vim.fs.joinpath(path, project_file)) + if file and file.type then + found_env = true + break + end + end + if not found_env then + vim.notify('Path is not a julia environment: \n`' .. path .. '`', vim.log.levels.WARN) + return + end + _activate_env(path) + else + local depot_paths = vim.env.JULIA_DEPOT_PATH + and vim.split(vim.env.JULIA_DEPOT_PATH, vim.fn.has 'win32' == 1 and ';' or ':') + or { vim.fn.expand '~/.julia' } + local environments = {} + vim.list_extend(environments, vim.fs.find(root_files, { type = 'file', upward = true, limit = math.huge })) + for _, depot_path in ipairs(depot_paths) do + local depot_env = vim.fs.joinpath(vim.fs.normalize(depot_path), 'environments') + vim.list_extend( + environments, + vim.fs.find(function(name, env_path) + return vim.tbl_contains(root_files, name) and string.sub(env_path, #depot_env + 1):match '^/[^/]*$' + end, { path = depot_env, type = 'file', limit = math.huge }) + ) + end + environments = vim.tbl_map(vim.fs.dirname, environments) + vim.ui.select(environments, { prompt = 'Select a Julia environment' }, _activate_env) + end +end + local cmd = { 'julia', '--startup-file=no', @@ -45,10 +98,18 @@ return { cmd = cmd, filetypes = { 'julia' }, root_dir = function(fname) - return util.root_pattern 'Project.toml'(fname) or util.find_git_ancestor(fname) + return util.root_pattern(unpack(root_files))(fname) or util.find_git_ancestor(fname) end, single_file_support = true, }, + commands = { + JuliaActivateEnv = { + activate_env, + description = 'Activate a Julia environment', + nargs = '?', + complete = 'file', + }, + }, docs = { description = [[ https://github.com/julia-vscode/julia-vscode @@ -70,6 +131,9 @@ Julia project, you must make sure that the project is instantiated: ```sh julia --project=/path/to/my/project -e 'using Pkg; Pkg.instantiate()' ``` + +Note: The julia programming language searches for global environments within the `environments/` +folder of `$JULIA_DEPOT_PATH` entries. By default this simply `~/.julia/environments` ]], }, } |
