105 lines
3.4 KiB
EmacsLisp
105 lines
3.4 KiB
EmacsLisp
;; -*- lexical-binding: t; -*-
|
|
|
|
;; Python configuration
|
|
(use-package python
|
|
:defer t
|
|
:straight (:type built-in)
|
|
:config
|
|
(add-hook 'python-mode-hook #'highlight-indent-guides-mode)
|
|
;; Redefine the python-mypy flycheck checker to account for projectile-compilation-dir
|
|
(flycheck-define-checker python-mypy
|
|
"Mypy syntax and type checker. Requires mypy>=0.580.
|
|
|
|
See URL `http://mypy-lang.org/'."
|
|
:command ("mypy"
|
|
"--show-column-numbers"
|
|
(config-file "--config-file" flycheck-python-mypy-config)
|
|
(option "--cache-dir" flycheck-python-mypy-cache-dir)
|
|
source-original)
|
|
:error-patterns
|
|
((error line-start (file-name) ":" line (optional ":" column)
|
|
": error:" (message) line-end)
|
|
(warning line-start (file-name) ":" line (optional ":" column)
|
|
": warning:" (message) line-end)
|
|
(info line-start (file-name) ":" line (optional ":" column)
|
|
": note:" (message) line-end))
|
|
:modes python-mode
|
|
;; Ensure the file is saved, to work around
|
|
;; https://github.com/python/mypy/issues/4746.
|
|
:predicate flycheck-buffer-saved-p
|
|
:working-directory (lambda (checker)
|
|
(or (projectile-compilation-dir)
|
|
default-directory)))
|
|
(add-to-list 'flycheck-disabled-checkers 'python-flake8))
|
|
|
|
;; Run a python repl at the project root
|
|
(defun projectile-run-python ()
|
|
(interactive)
|
|
(let ((default-directory (projectile-project-root)))
|
|
(call-interactively #'run-python)))
|
|
|
|
(with-eval-after-load 'projectile
|
|
(general-def projectile-command-map
|
|
"s p" #'projectile-run-python
|
|
"x p" #'projectile-run-python))
|
|
|
|
;; pyvenv to track virtual environments
|
|
(use-package pyvenv
|
|
:defer 3
|
|
:config
|
|
(pyvenv-mode)
|
|
(pyvenv-tracking-mode))
|
|
|
|
;; pyenv to track Python version
|
|
(use-package pyenv
|
|
:straight (:host github :repo "aiguofer/pyenv.el")
|
|
:if (executable-find "pyenv")
|
|
:defer 3
|
|
:init
|
|
(setq pyenv-executable (executable-find "pyenv"))
|
|
:config
|
|
;; Patch version alias stuff I don't use to stop spamming messages
|
|
(defun pyenv--version-alias-file ()
|
|
"Get peynv version alias file path."
|
|
(when pyenv-use-alias
|
|
(pyenv--call-process "version-alias-file")))
|
|
(global-pyenv-mode)
|
|
(defun pyenv-switch-buffer-hook (prev curr)
|
|
(pyenv-use-corresponding))
|
|
(defun pyenv-use-corresponding-vterm-hook ()
|
|
(when (eq major-mode 'vterm-mode)
|
|
(vterm-send-C-e)
|
|
(vterm-send-C-u)
|
|
(vterm-send-string (format "export PYENV_VERSION=%s\n" (getenv "PYENV_VERSION")))))
|
|
(add-hook 'switch-buffer-functions #'pyenv-switch-buffer-hook)
|
|
(add-hook 'eshell-directory-change-hook #'pyenv-use-corresponding)
|
|
(add-hook 'pyenv-mode-hook #'pyenv-use-corresponding-vterm-hook)
|
|
:custom
|
|
(pyenv-show-active-python-in-modeline nil))
|
|
|
|
;; A pipenv integration
|
|
(use-package pipenv
|
|
:defer 2
|
|
:hook (python-mode . pipenv-mode))
|
|
|
|
;; LSP using Microsoft's pyright language server
|
|
(use-package lsp-pyright
|
|
:hook (python-mode . (lambda ()
|
|
(require 'lsp-pyright)
|
|
(lsp-deferred)))
|
|
:custom
|
|
(lsp-pyright-use-library-code-for-types t)
|
|
(lsp-pyright-multi-root t)
|
|
:general
|
|
(python-mode-map "C-c C-d" #'lsp-describe-thing-at-point))
|
|
|
|
;; isort to sort Python imports
|
|
(use-package py-isort
|
|
:commands (py-isort-buffer py-isort-region)
|
|
:config
|
|
(setq py-isort-options '("-m=3"))
|
|
:general
|
|
(python-mode-map "C-c C-i" #'py-isort-buffer))
|
|
|
|
(provide 'init-python)
|