🦁
Neovim起動時にPythonの仮想環境をActivateしたい!
動機
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
})
参考
Discussion