不一

配置Emacs的python3开发环境

字数统计: 1k阅读时长: 4 min
2019/10/28 Share

没有启动Emacs的一天就是划水的一天。

软件环境

操作系统:MacOS 10.14
Emacs版本:26.3
Python版本:3.7.4

开始捣腾

安装Emacs-mac

Mac上使用Homebrew安装MacOS专属版Emacs:

1
2
3
4
5
6
# 添加源
brew tap railwaycat/emacsmacport
# 安装Emacs
brew install emacs-mac
# 把安装好的Emacs创建快捷方式到/Applications目录,这样就可以在LaunchPad里面看到了
ln -s /usr/local/Cellar/emacs/24.x/Emacs.app /Applications/

顺便贴上在Ubuntu Server上安装Emacs的几条命令:

1
2
3
4
5
6
# 添加源
sudo apt-add-repository ppa:ubuntu-elisp/ppa
# 刷新一下软件列表
sudo apt-get update
# 安装Emacs
sudo apt-get install emacs-snapshot emacs-snapshot-el

Python 3

Python 2已经寿终正寝了,MacOS似乎还是默认安装的Python 2。
不过在Mac上安装Python 3应该是很容易的一件事,使用Homebrew一键搞定:
$ brew install python3

使用虚拟环境

  1. 首先使用pip3安装虚拟环境:
    $ pip3 install virtualenv

  2. 在Emacs配置文件下创建虚拟环境目录:
    $ mkdir ~/.emacs.d/.python-environments

  3. 在目录下创建python 3虚拟环境,取名为jedi
    $ virtualenv -p /usr/local/bin/python3 --prompt="<venv:jedi>" jedi

  4. 使用虚拟环境下的pip安装jedi和epc,在bin目录下有多个pip,比如pippip3,其实是一样的。
    jedi用于pyhton自动补全的后端;
    epc用于python和elisp交互;
    命令如下:
    ~/.emacs.d/.python-environments/jedi/bin/pip install jedi epc argparse
    或者使用setup.py一键安装所需要的库:
    ~/.emacs.d/.python-environments/jedi/bin/pip install —upgrade ~/.emacs.d/elpa/jedi-core-[tab自动补全]

配置Emacs

把代码都放在~/.emacs.d/init.el里面是稳妥的也是杂乱的。但是这个不是现在的重点,具体的文件组织可以参考我的Emacs配置目录。以下的代码放在上诉文件中可以运行。

  1. 我用use-package来管理第三方包,在emacs中package-install就可以直接使用,或者使用下面代码:

    1
    2
    3
    (unless (package-installed-p 'use-package)
    (package-refresh-contents)
    (package-install 'use-package))
  2. 使用Python 3,至少告诉Emacs系统安装的python3解释器在什么地方,根据系统判断安装位置并定义python3Dic

    1
    2
    3
    4
    5
    (if (eq system-type 'darwin)
    ;; MacOS的python3目录
    (setq python3Dic "/usr/local/bin")
    ;; 其他Linux系统的python3目录
    (setq python3Dic "/usr/bin"))
  3. 自定义Python开发环境:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ;; 自定义一套开发环境
    (defun my-python-mode-config ()
    (setq
    ;; 缩进长度4个空格
    python-indent 4
    ;; 使用空格而不是tab进行缩进
    indent-tabs-mode nil
    ;; 如果有tab的话就解释成4个空格
    default-tab-width 4

    ;; 设置 run-python 的参数,主要是python3解释器的路径,不然默认用的是python2
    python-shell-interpreter (concat python3Dic "/python3")
    python-shell-completion-native-enable nil
    py-python-command (concat python3Dic "/python3")
    exec-path (append exec-path '(python3Dic))
    python-shell-completion-native-disabled-interpreters '("python")))

    ;; 在每次进入python-mode的时候加载自定义的python开发环境
    (add-hook 'python-mode-hook 'my-python-mode-config)
  4. 使用company-jedi的python自动补全库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (use-package company-jedi
    :ensure t
    :init
    ;; 对company-jedi的一些初始化设置
    (progn
    ;; 按下字符就弹出补全,0延迟
    (setq jedi:get-in-function-call-delay 0)
    ;; 进入pyhton-mode的时候初始化jedi
    (add-hook 'python-mode-hook 'jedi:setup)
    ;; 在打出点的时候弹出补全
    (setq jedi:complete-on-dot t)
    ;; 补全的时候识别简写
    (setq jedi:use-shortcuts t)
    ;; 补全列表循环
    (setq company-selection-wrap-around t)
    ;; 虚拟环境
    (setq jedi:environment-root "jedi")))
  5. 配合使用专业化的python开发环境elpy:

    1
    2
    3
    4
    5
    6
    ;;启用elpy的python开发环境
    (use-package elpy
    :ensure t
    :commands elpy-enable
    :hook
    (python-mode . elpy-mode))
  6. 使用flycheck进行语法检查

    1
    2
    3
    4
    5
    6
    ;; 代码检查
    (use-package flycheck
    :ensure t
    :hook
    (progn
    (python-mode . flycheck-mode)))

尽情使用

pip

.emacs/.python-environment虚拟环境目录下的pip和系统环境的pip有相同的模块内容,因此不需要使用虚拟环境下的pip来进行模块管理:

编辑

company-jedi的代码补全效果如下:

运行

使用快捷点C-c C-c可以在其他窗口打开python执行环境,并将当前窗口的内容执行,使用的python版本当然就是python 3了:

CATALOG
  1. 1. 软件环境
  2. 2. 开始捣腾
    1. 2.1. 安装Emacs-mac
    2. 2.2. Python 3
    3. 2.3. 使用虚拟环境
    4. 2.4. 配置Emacs
  3. 3. 尽情使用
    1. 3.1. pip
    2. 3.2. 编辑
    3. 3.3. 运行