🦁

Neovim起動時にPythonの仮想環境をActivateしたい!

2024/06/09に公開

動機

Neovim内で定義ジャンプを利用する際に、venv内の外部ライブラリに対してもLSPの機能を利用したかったためです。pyrightの機能としてvenvまでのPATHを記述するオプションがあるようですが、pyrightのためだけにセッティングを書くのが億劫だった(おい)のと起動時にactivateしておくとNeovim内で起動するターミナルに対してもvenv内のpythonにPATHが当たるといった恩恵があります。

環境

macOS Sonoma14.4
terminal kitty(0.35.1)
Neovim NVIM v0.10.0

やり方

init.luaなどに以下を記述します。

init.lua
local function auto_activate_venv()
  local venv_path = vim.fn.getcwd() .. '/.venv'
  if vim.fn.isdirectory(venv_path) == 1 then
    vim.env.VIRTUAL_ENV = venv_path
    vim.env.PATH = venv_path .. '/bin:' .. vim.env.PATH
    end)
  end
end

vim.api.nvim_create_autocmd('VimEnter', {
  callback = function()
    auto_activate_venv()
  end
})

解説

auto_active_venv関数を定義しています。
この関数はNeovimが起動された際のディレクトリに.venvがあるかどうかを判定し、存在した場合、以下の環境変数を.venv/bin/activateにあるシェルスクリプトの挙動をもとに設定しています。
・VIRTUAL_ENV
・PATH

このauto_active_venvをautocmdを用いてNeovimが起動される時のフックであるVimEnterを用いてauto_activate_venv関数を実行します。

おまけ

自分の環境ではnvim-notifyというリッチな通知を出してくれるプラグインを利用しているので、環境変数が更新されたタイミングで通知を出すようにしています。

nvim-notifyを用いたバージョン
init.lua
local function auto_activate_venv()
  local venv_path = vim.fn.getcwd() .. '/.venv'
  if vim.fn.isdirectory(venv_path) == 1 then
    vim.env.VIRTUAL_ENV = venv_path
    vim.env.PATH = venv_path .. '/bin:' .. vim.env.PATH

    require("noice").redirect(function()
      local notify = require('notify')
      notify("activate -> " .. venv_path, "info", { title = "Activate venv" })
    end)
  end
end

vim.api.nvim_create_autocmd('VimEnter', {
  callback = function()
    auto_activate_venv()
  end
})

参考

https://zenn.dev/pluck/scraps/27b2a2bd75e6f3
https://github.com/rcarriga/nvim-notify

Discussion