diff --git a/emacs.el b/emacs.el index 53f2fe4..d34cf20 100644 --- a/emacs.el +++ b/emacs.el @@ -2007,6 +2007,47 @@ initializing." (tabulated-list-print nil nil)) +;;;;;;;;;;;;;;;;;;;;;;; +;; with-venv + +(defmacro with-venv-dir (dir &rest body) + "Set python environment to DIR and execute BODY." + `(progn + (message "%S" ,dir) + ,@body)) + +(defmacro with-venv (&rest body) + "Execute BODY with venv enabled. + +This function tries to find suitable venv dir, or raise error when none found." + `(with-venv-dir ,(with-venv-find-venv-dir) ,@body)) + +(defvar-local with-venv-venv-dir + nil + "Venv directory path.") + +(defun with-venv-find-venv-dir (&optional dir) + "Try to find venv dir for DIR or raise error when none found." + (with-temp-buffer + (when dir + (cd dir)) + (or + ;; If set explicitly use it + with-venv-venv-dir + ;; Check pipenv + (let ((status (call-process "pipenv" nil t nil "--venv"))) + (goto-char (point-min)) + (and (eq status 0) + (buffer-substring-no-properties (point-at-bol) + (point-at-eol)))) + ;; Search for .venv dir + (locate-dominating-file default-directory + ".venv"))) + + +;; (with-venv (:dir default-directory) (message "a")) +;; (with-venv () (message "a")) + ;; Local Variables: ;; flycheck-disabled-checkers: (emacs-lisp-checkdoc) ;; flycheck-checker: emacs-lisp