2014-01-20 7 views
10

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?

Antwort

13

Ich habe jetzt auf einer Lösung angesiedelt, die das virtualenvwrapper ELPA-Paket verwendet virtualenvs zu aktivieren, so dass Emacs-jedi den virtualenv Weg von der VIRTUAL_ENV Umgebungsvariable holen.

Dies ist die komplette, arbeiten, Emacs-jedi Initialisierung:

(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) 

Denken Sie daran, dass Sie zuerst installieren müssen virtualenvwrapper.

Lesen Sie die virtualenvwrapper documentation für eine alternative Möglichkeit zur automatischen Aktivierung von virtuellen Projektumgebungen. Kurz gesagt können Sie eine .dir-locals.el-Datei im Stammverzeichnis des Projekts, mit folgendem Inhalt:

((python-mode . ((project-venv-name . "myproject-env")))) 

ändern "myproject-env" auf den Namen Ihres virtualenv und aktivieren Sie die virtualenvironment mit dem python-mode Haken:

(add-hook 'python-mode-hook (lambda() 
           (hack-local-variables) 
           (venv-workon project-venv-name))) 
(add-hook 'python-mode-hook 'jedi:setup) 
+0

Es gibt ein weiteres schönes Paket auto-virtualenvwrapper: https://github.com/robert-zaremba/auto-virtualenvwrapper.el. Ich denke du solltest es versuchen. – pingz