Ответ 1
Теперь я решил использовать решение, которое использует пакет virtualenvwrapper ELPA для активации virtualenvs, позволяя emacs-jedi забирать virtualenv из переменной окружения VIRTUAL_ENV.
Вот полная, работающая, emacs-jedi инициализация:
(defun project-directory (buffer-name)
"Return the root directory of the project that contain the
given BUFFER-NAME. Any directory with a .git or .jedi file/directory
is considered to be a project root."
(interactive)
(let ((root-dir (file-name-directory buffer-name)))
(while (and root-dir
(not (file-exists-p (concat root-dir ".git")))
(not (file-exists-p (concat root-dir ".jedi"))))
(setq root-dir
(if (equal root-dir "/")
nil
(file-name-directory (directory-file-name root-dir)))))
root-dir))
(defun project-name (buffer-name)
"Return the name of the project that contain the given BUFFER-NAME."
(let ((root-dir (project-directory buffer-name)))
(if root-dir
(file-name-nondirectory
(directory-file-name root-dir))
nil)))
(defun jedi-setup-venv ()
"Activates the virtualenv of the current buffer."
(let ((project-name (project-name buffer-file-name)))
(when project-name (venv-workon project-name))))
(setq jedi:setup-keys t)
(setq jedi:complete-on-dot t)
(add-hook 'python-mode-hook 'jedi-setup-venv)
(add-hook 'python-mode-hook 'jedi:setup)
Помните, что сначала нужно установить virtualenvwrapper.
Прочитайте документацию virtualenvwrapper для альтернативного способа автоматической активации виртуальной среды проекта. Короче говоря, вы можете создать файл .dir-locals.el
в корне вашего проекта со следующим содержимым:
((python-mode . ((project-venv-name . "myproject-env"))))
Измените "myproject-env"
на имя своего виртуального пользователя и активируйте виртуальную окружение с помощью python-mode
hook:
(add-hook 'python-mode-hook (lambda ()
(hack-local-variables)
(venv-workon project-venv-name)))
(add-hook 'python-mode-hook 'jedi:setup)