Ich möchte emacs-jedi erkennen, wenn ich Dateien in verschiedenen Projekten bearbeiten, und verwenden Sie die entsprechenden virtualenv, wenn es verfügbar ist. Per Konvention haben meine Virtualenvs den gleichen Namen wie meine Projekte. Sie befinden sich in $HOME/.virtualenvs/
Wie kann ich emacs-jedi verwenden projektspezifische virtualenvs
Ich fand kenobi.el aber es nimmt an, dass virtualenvs im bin-Verzeichnis im Projektstamm gefunden werden. Es hat auch ein paar andere Funktionen, die ich überhaupt nicht brauche.
Mit Inspiration von Kenobi.el, schrieb ich die folgende Initialisierung für Jedi. Es funktioniert ziemlich gut, aber nicht perfekt.
Wenn ich Bibliothek A
von meinem Projekt importieren, und A
importiert B
. Ich bin in der Lage, in Definitionen zu springen, die durch A
definiert werden, aber sobald ich dort bin, kann ich nicht weiter in Definitionen von B
springen.
Meine Initialisierung:
(defun project-directory (buffer-name)
(let ((git-dir (file-name-directory buffer-name)))
(while (and (not (file-exists-p (concat git-dir ".git")))
git-dir)
(setq git-dir
(if (equal git-dir "/")
nil
(file-name-directory (directory-file-name git-dir)))))
git-dir))
(defun project-name (buffer-name)
(let ((git-dir (project-directory buffer-name)))
(if git-dir
(file-name-nondirectory
(directory-file-name git-dir))
nil)))
(defun virtualenv-directory (buffer-name)
(let ((venv-dir (expand-file-name
(concat "~/.virtualenvs/" (project-name buffer-name)))))
(if (and venv-dir (file-exists-p venv-dir))
venv-dir
nil)))
(defun jedi-setup-args()
(let ((venv-dir (virtualenv-directory buffer-file-name)))
(when venv-dir
(set (make-local-variable 'jedi:server-args) (list "--virtual-env" venv-dir)))))
(setq jedi:setup-keys t)
(setq jedi:complete-on-dot t)
(add-hook 'python-mode-hook 'jedi-setup-args)
(add-hook 'python-mode-hook 'jedi:setup)
Was mit falsch ist, wie ich jedi initialisieren?
Es gibt ein weiteres schönes Paket auto-virtualenvwrapper: https://github.com/robert-zaremba/auto-virtualenvwrapper.el. Ich denke du solltest es versuchen. – pingz