10sr преди 5 години
родител
ревизия
82b78af375
Подписан от: 10sr GPG ключ ID: 7BEC428194130EB2
променени са 1 файла, в които са добавени 41 реда и са изтрити 17 реда
  1. +41
    -17
      emacs.el

+ 41
- 17
emacs.el Целия файл

@@ -2021,18 +2021,22 @@ This variable is intended to be explicitly set by user.
When nil, `with-venv' tries to find suitable venv dir.")

(defmacro with-venv-dir (dir &rest body)
"Set python environment to DIR and execute BODY."
"Set python environment to DIR and execute BODY.

This macro does not check if DIR is a valid python environemnt.
If dir is nil, execute BODY as usual."
`(let ((--with-venv-process-environment-orig (cl-copy-list process-environment))
(--with-venv-exec-path-orig (cl-copy-list exec-path)))
(unwind-protect
(progn
;; Do the same thing that bin/activate does
(setq exec-path
(cons (concat ,dir "/bin")
exec-path))
(setenv "VIRTUAL_ENV" ,dir)
(setenv "PATH" (concat ,dir "/bin:" (or (getenv "PATH") "")))
(setenv "PYTHONHOME")
(when dir
;; Do the same thing that bin/activate does
(setq exec-path
(cons (concat ,dir "/bin")
exec-path))
(setenv "VIRTUAL_ENV" ,dir)
(setenv "PATH" (concat ,dir "/bin:" (or (getenv "PATH") "")))
(setenv "PYTHONHOME"))
,@body)
(setq process-environment
--with-venv-process-environment-orig)
@@ -2042,25 +2046,37 @@ When nil, `with-venv' tries to find suitable venv dir.")
(defmacro with-venv (&rest body)
"Execute BODY with venv enabled.

This function tries to find suitable venv dir, or raise error when none found."
This function tries to find suitable venv dir, or run BODY as usual when no
suitable environment was found."
`(with-venv-dir
;; If set explicitly use it
,(or with-venv-venv-dir
(with-venv-find-venv-dir))
,@body))

(defvar-local with-venv-previously-used nil
"Previously used venv dir path.")
(defun with-venv-find-venv-dir (&optional dir)
"Try to find venv dir for DIR or raise error when none found."
"Try to find venv dir for DIR.
If none found return nil."
(with-temp-buffer
(when dir
(cd dir))
(or
;; Check pipenv
(with-venv--find-venv-dir-pipenv)
;; Check poetry
(with-venv--find-venv-dir-poetry)
;; Search for .venv dir
(with-venv--find-venv-dir-by-name))))
(let ((result (or
;; Check used previously
(with-venv-check-exists
with-venv-previously-used)
;; Check pipenv
(with-venv-check-exists
(with-venv--find-venv-dir-pipenv))
;; Check poetry
(with-venv-check-exists
(with-venv--find-venv-dir-poetry))
;; Search for .venv dir
(with-venv-check-exists
(with-venv--find-venv-dir-by-name)))))
(setq with-venv-previously-used
result))))

(defun with-venv--find-venv-dir-pipenv ()
"Try to find venv dir via pipenv."
@@ -2087,9 +2103,17 @@ This function tries to find suitable venv dir, or raise error when none found."
(let ((dir (locate-dominating-file default-directory
".venv")))
(when dir
;; TODO: check with -check-exists
(expand-file-name ".venv"
dir))))

(defun with-venv-check-exists (dir)
"Return DIR as is if \"bin\" directory was found under DIR."
(and dir
(file-directory-p (expand-file-name "bin"
dir))
dir))


;; (with-venv (:dir default-directory) (message "a"))
;; (with-venv () (message "a"))


Зареждане…
Отказ
Запис