13

別のプロジェクトでファイルを編集しているときに emacs-jedi がそれを検出し、対応する virtualenv が利用可能であればそれを使用したいと考えています。慣例により、私の virtualenv は私のプロジェクトと同じ名前です。彼らはに位置しています$HOME/.virtualenvs/

kenobi.elを見つけましたが、 virtualenvがプロジェクト ルートの bin ディレクトリにあることを前提としています。また、私がまったく必要としない機能が他にもいくつかあります。

kenobi.el からインスピレーションを得て、jedi の次の初期化を作成しました。かなりうまく機能しますが、完全ではありません。

AプロジェクトからライブラリをインポートAすると、 B. によって定義された定義にジャンプすることはできますAが、そこに到達すると、 からの定義にジャンプし続けることはできませんB

私の初期化:

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

ジェダイを初期化する方法の何が問題になっていますか?

4

1 に答える 1

14

私は今、virtualenvwrapper ELPA パッケージを使用して virtualenv をアクティブにし、emacs-jedi が VIRTUAL_ENV 環境変数から virtualenv パスを取得できるようにするソリューションに落ち着きました。

以下は、完全に動作する 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"))))

virtualenv の名前に変更し、フック"myproject-env"を使用して virtualenvironment を有効にします。python-mode

(add-hook 'python-mode-hook (lambda ()
                              (hack-local-variables)
                              (venv-workon project-venv-name)))
(add-hook 'python-mode-hook 'jedi:setup)
于 2014-01-20T23:28:32.133 に答える