diff --git a/.dir-locals.el b/.dir-locals.el index 23609b4d2..d0e62208e 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,13 +1,22 @@ ;;; .dir-locals.el ;; -;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in your -;; emacs session, mostly you have jedi-mode enabled but the python enviroment is -;; missed. The python environment has to be next to the -;; ``/.dir-locals.el`` in:: +;; Per-Directory Local Variables: +;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html ;; -;; ./local/py3 +;; .. hint:: ;; -;; In Emacs, some buffer locals are referencing the project environment: +;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in +;; your emacs session, mostly you have jedi-mode enabled but the python +;; enviroment is missed. The python environment has to be next to the +;; ``/.dir-locals.el`` in:: +;; +;; ./local/py3 +;; +;; To setup such an environment, build target:: +;; +;; $ make pyenv.install +;; +;; Some buffer locals are referencing the project environment: ;; ;; - prj-root --> / ;; - python-environment-directory --> /local @@ -17,22 +26,12 @@ ;; `process-environment' and `exec-path' get proper values in order to run ;; shells inside the specified virtualenv, example:: ;; (setq python-shell-virtualenv-root "/path/to/env/") +;; - python-shell-interpreter --> /local/py3/bin/python ;; -;; To setup such an environment build target 'pyenv' or 'pyenvinstall':: +;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter' +;; from the local py3 environment. ;; -;; $ make pyenvinstall -;; -;; Alternatively create the virtualenv, source it and install jedi + epc -;; (required by `emacs-jedi `_):: -;; -;; $ python -m venv ./local/py3 -;; ... -;; $ source ./local/py3/bin/activate -;; (py3)$ # now install into the activated 'py3' environment .. -;; (py3)$ pip install jedi epc -;; ... -;; -;; Here is what also I found useful to add to my .emacs:: +;; Other useful jedi stuff you might add to your ~/.emacs:: ;; ;; (global-set-key [f6] 'flycheck-mode) ;; (add-hook 'python-mode-hook 'my:python-mode-hook) @@ -45,97 +44,91 @@ ;; (define-key python-mode-map (kbd "M-.") 'jedi:goto-definition) ;; (define-key python-mode-map (kbd "M-,") 'jedi:goto-definition-pop-marker) ;; ) -;; ((nil . ((fill-column . 80) (indent-tabs-mode . nil) - ;; project root folder is where the `.dir-locals.el' is located - (eval . (setq-local - prj-root (locate-dominating-file default-directory ".dir-locals.el"))) - (eval . (setq-local - python-environment-directory (expand-file-name "./local" prj-root))) - ;; use 'py3' enviroment as default - (eval . (setq-local - python-environment-default-root-name "py3")) - (eval . (setq-local - python-shell-virtualenv-root - (expand-file-name python-environment-default-root-name python-environment-directory) - )) - (eval . (setq-local - python-shell-interpreter - (expand-file-name "bin/python" python-shell-virtualenv-root))) - )) + (eval . (progn + ;; project root folder is where the `.dir-locals.el' is located + (setq-local prj-root + (locate-dominating-file default-directory ".dir-locals.el")) + + (setq-local python-environment-directory + (expand-file-name "./local" prj-root)) + + ;; use 'py3' enviroment as default + (setq-local python-environment-default-root-name + "py3") + + (setq-local python-shell-virtualenv-root + (expand-file-name + python-environment-default-root-name python-environment-directory)) + + (setq-local python-shell-interpreter + (expand-file-name + "bin/python" python-shell-virtualenv-root)))))) (makefile-gmake-mode - . ((indent-tabs-mode . t) - )) + . ((indent-tabs-mode . t))) (yaml-mode - . ( - ;; flycheck should use the local py3 environment - (eval . (setq-local - flycheck-yaml-yamllint-executable - (expand-file-name "bin/yamllint" python-shell-virtualenv-root))) - (eval . (setq-local - flycheck-yamllintrc - (expand-file-name ".yamllint.yml" prj-root))) - (flycheck-checker . yaml-yamllint) - )) + . ((eval . (progn + + ;; flycheck should use the local py3 environment + (setq-local flycheck-yaml-yamllint-executable + (expand-file-name "bin/yamllint" python-shell-virtualenv-root)) + + (setq-local flycheck-yamllintrc + (expand-file-name ".yamllint.yml" prj-root)) + + (flycheck-checker . yaml-yamllint))))) (python-mode - . ((indent-tabs-mode . nil) + . ((eval . (progn - (eval . (setq-local - python-environment-virtualenv - (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) - ;;"--system-site-packages" - "--quiet"))) + (setq-local python-environment-virtualenv + (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) + ;;"--system-site-packages" + "--quiet")) - (eval . (setq-local - pylint-command - (expand-file-name "bin/pylint" python-shell-virtualenv-root))) + (setq-local pylint-command + (expand-file-name "bin/pylint" python-shell-virtualenv-root)) - ;; pylint will find the '.pylintrc' file next to the CWD - ;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options - (eval . (setq-local - flycheck-pylintrc ".pylintrc")) + ;; pylint will find the '.pylintrc' file next to the CWD + ;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options + (setq-local flycheck-pylintrc + ".pylintrc") - ;; flycheck & other python stuff should use the local py3 environment - (eval . (setq-local - flycheck-python-pylint-executable python-shell-interpreter)) + ;; flycheck & other python stuff should use the local py3 environment + (setq-local flycheck-python-pylint-executable + python-shell-interpreter) - ;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server + ;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server + ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You + ;; can specify a full path instead of a name (relative path). In that case, + ;; python-environment-directory is ignored and Python virtual environment + ;; is created at the specified path. + (setq-local jedi:environment-root + python-shell-virtualenv-root) - ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You - ;; can specify a full path instead of a name (relative path). In that case, - ;; python-environment-directory is ignored and Python virtual environment - ;; is created at the specified path. - (eval . (setq-local jedi:environment-root python-shell-virtualenv-root)) + ;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command + (setq-local jedi:server-command + (list python-shell-interpreter + jedi:server-script)) - ;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command - (eval .(setq-local - jedi:server-command - (list python-shell-interpreter - jedi:server-script) - )) - - ;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv' - ;; is set buffer local! No need to setup jedi:environment-virtualenv: - ;; - ;; Virtualenv command to use. A list of string. If it is nil, - ;; python-environment-virtualenv is used instead. You must set non-nil - ;; value to jedi:environment-root in order to make this setting work. - ;; - ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv - ;; - ;; (eval . (setq-local - ;; jedi:environment-virtualenv - ;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) - ;; ;;"--python" - ;; ;;"/usr/bin/python3.4" - ;; ))) - - ;; jedi:server-args - - ))) + ;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv' + ;; is set buffer local! No need to setup jedi:environment-virtualenv: + ;; + ;; Virtualenv command to use. A list of string. If it is nil, + ;; python-environment-virtualenv is used instead. You must set non-nil + ;; value to jedi:environment-root in order to make this setting work. + ;; + ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv + ;; + ;; (setq-local jedi:environment-virtualenv + ;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root) + ;; "--python" + ;; "/usr/bin/python3.4" + ;; )) + )))) + )