aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/lspconfig/server_configurations/julials.lua66
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`
]],
},
}