我来自PyCharm,想要学习如何在Emacs(Spacemacs)上设置Python。
PyCharm具有称为类型提示的功能,该功能基本上允许指定类型,然后根据指定的类型获取提示。 Python 3.5+拥有PEP 484 -- 类型提示,这允许在没有注释的情况下指定类型。在PEP 484之前,使用注释来指定类型。
Emacs中是否有类似的类型提示?
我来自PyCharm,想要学习如何在Emacs(Spacemacs)上设置Python。
PyCharm具有称为类型提示的功能,该功能基本上允许指定类型,然后根据指定的类型获取提示。 Python 3.5+拥有PEP 484 -- 类型提示,这允许在没有注释的情况下指定类型。在PEP 484之前,使用注释来指定类型。
Emacs中是否有类似的类型提示?
Jedi 0.10.0新增了对PEP 484的部分支持,这是在https://github.com/davidhalter/jedi/issues/858中提出的。
我在2020年看到了这个问题,发现有一些更好的工具可以用来解决它。仅使用Jedi可能无法满足您的需求。相反,您很可能需要使用 elpy
、 flycheck
、 flycheck-pycheckers
、 pyflakes
和 mypy
组合。
Elpy是Emacs Python IDE包。flycheck是Emacs的通用语法检查工具包。flycheck-pycheckers与flycheck配合使用,允许您使用多个Python语法检查器,因为pyflakes不处理类型提示,而mypy不处理通用语法-您需要同时使用两者。
因此,您需要执行以下步骤:
使用pip安装pyflakes和mypy。
在您的Emacs配置中安装 use-package
(我会将其说明留给您)。
将以下行添加到您的init.el或.emacs文件中:
;; flycheck
(use-package flycheck
:ensure t
:config
(global-flycheck-mode t)
;; note that these bindings are optional
(global-set-key (kbd "C-c n") 'flycheck-next-error)
;; this might override a default binding for running a python process,
;; see comments below this answer
(global-set-key (kbd "C-c p") 'flycheck-prev-error)
)
;; flycheck-pycheckers
;; Allows multiple syntax checkers to run in parallel on Python code
;; Ideal use-case: pyflakes for syntax combined with mypy for typing
(use-package flycheck-pycheckers
:after flycheck
:ensure t
:init
(with-eval-after-load 'flycheck
(add-hook 'flycheck-mode-hook #'flycheck-pycheckers-setup)
)
(setq flycheck-pycheckers-checkers
'(
mypy3
pyflakes
)
)
)
;; elpy
(use-package elpy
:after poetry
:ensure t
:config
(elpy-enable)
(add-hook 'elpy-mode-hook 'poetry-tracking-mode) ;; optional if you're using Poetry
(setq elpy-rpc-virtualenv-path 'current)
(setq elpy-syntax-check-command "~/.pyenv/shims/pyflakes") ;; or replace with the path to your pyflakes binary
;; allows Elpy to see virtualenv
(add-hook 'elpy-mode-hook
;; pyvenv-mode
'(lambda ()
(pyvenv-mode +1)
)
)
;; use flycheck instead of flymake
(when (load "flycheck" t t)
(setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
(add-hook 'elpy-mode-hook 'flycheck-mode))
)
;; poetry
(use-package poetry
:ensure t)
这个方案将帮助你在Emacs中设置Python语法和类型提示。
(kbd "C-c p")
代表运行 Python 进程,最好为其设置不同的键绑定。 - alperelpy
曾经很好用,我使用了与@jidicula非常相似的设置。然而,elpy
不再与当前版本的jedi
兼容,这个问题已经超过一年没有解决。原来elpy
不再维护,参见https://github.com/jorgenschaefer/elpy
我尝试了eglot
,它能够胜任工作。然而,eglot
的作者坚持使用过时的flymake
而不是其现代替代品flycheck
。flycheck
可以同时使用mypy3
和pyflakes
,而flymake
不能,因此必须在同一个缓冲区中同时使用flycheck
和flymake
,这会产生不必要的摩擦和新的困难,我不想浪费时间。
lsp-mode
目前似乎是最好的选择。它更受欢迎,有5倍的贡献者,而且更加灵活和不持有偏见,因为它可以与flycheck
和flymake
同时使用。
我使用以下命令安装lsp-mode
Python依赖项:
conda install python-lsp-server pylsp-mypy
这些内容也应该可以通过 pip
获得。
lsp-mode
的文档。 - Maxim Egorushkin
--py2
标志来支持Python2的语法。我不确定flychecker是否支持这一点,你可以安装并尝试一下。 - Anzel