AckslD / swenv.nvim

Tiny plugin to quickly switch python virtual environments from within neovim without restarting.
206 stars 29 forks source link

Poetry support #35

Open palandovalex opened 6 months ago

aemonge commented 3 months ago

Wouldn't it be easier to change https://github.com/AckslD/swenv.nvim/blob/main/lua/swenv/api.lua#L200 : ](https://github.com/AckslD/swenv.nvim/blob/main/lua/swenv/api.lua#L188 :

from:

M.auto_venv = function()
  -- the function tries to activate in-project venvs, if present. Otherwise it tries to activate a venv in venvs folder
  -- which best matches the project name.
  local loaded, project_nvim = pcall(require, 'project_nvim.project')
  local venvs = settings.get_venvs(settings.venvs_path)
  if not loaded then
    print('Error: failed to load the project_nvim.project module')
    return
  end

  local project_dir, _ = project_nvim.get_project_root()
  if project_dir then -- project_nvim.get_project_root might not always return a project path
    local venv_name = read_venv_name_in_project(project_dir)
    if venv_name then
      local venv = { path = get_local_venv_path(project_dir), name = venv_name }
      set_venv(venv)
      return
    end
    venv_name = read_venv_name_common_dir(project_dir)
    if venv_name then
      local venv = best_match(venvs, venv_name)
      if venv then
        set_venv(venv)
        return
      end
    end
  end
end

to:

M.auto_venv = function()
  -- Check if the $VIRTUAL_ENV environment variable exists
  local virtual_env = os.getenv("VIRTUAL_ENV")
  if virtual_env then
    -- Extract the last part of the $VIRTUAL_ENV path
    local venv_name = virtual_env:match("([^/]+)$")
    if venv_name then
      local venv = { path = virtual_env, name = venv_name }
      set_venv(venv)
      return
    end
  end

  -- The function tries to activate in-project venvs, if present. Otherwise it tries to activate a venv in venvs folder
  -- which best matches the project name.
  local loaded, project_nvim = pcall(require, 'project_nvim.project')
  local venvs = settings.get_venvs(settings.venvs_path)
  if not loaded then
    print('Error: failed to load the project_nvim.project module')
    return
  end

  local project_dir, _ = project_nvim.get_project_root()
  if project_dir then -- project_nvim.get_project_root might not always return a project path
    local venv_name = read_venv_name_in_project(project_dir)
    if venv_name then
      local venv = { path = get_local_venv_path(project_dir), name = venv_name }
      set_venv(venv)
      return
    end
    venv_name = read_venv_name_common_dir(project_dir)
    if venv_name then
      local venv = best_match(venvs, venv_name)
      if venv then
        set_venv(venv)
        return
      end
    end
  end
end
aemonge commented 3 months ago

Basically using $VIRTUAL_ENV

  local virtual_env = os.getenv("VIRTUAL_ENV")
  if virtual_env then
    -- Extract the last part of the $VIRTUAL_ENV path
    local venv_name = virtual_env:match("([^/]+)$")
    if venv_name then
      local venv = { path = virtual_env, name = venv_name }
      set_venv(venv)
      return
    end
  end
AckslD commented 3 months ago

@aemonge hmm, but wouldn't that only work if you already had the venv activated? I don't actually use the auto_venv feature myself but if I understand it correctly it's intention is to activate a venv automatically. So that env var wouldn't exist?

aemonge commented 3 months ago

You're right !