写给 Pythonist 的 Spacemacs 入门指北

作者: 无与童比 | 来源:发表于2017-01-16 12:48 被阅读7430次

前言

最开始,使用 Sublime Text 编码,后来用 Vim 混合 PyCharm 写 Python。

前几天,Github 上的 Spacemacs 已经成功的突破一万 Star, 听说几个我非常佩服的 Pythoner(比如『Python Web 开发实战』的作者董伟明) 也是非常喜欢 Spacemacs, 我就萌生了从 Vim 切换到 Spacemacs 的想法,说做就做。

注:本文所有内容基于 macOS 10.11, 软件环境为 zsh , pyenv , python3.5.2 , node5.12.0. 其他类 Unix 平台略作修改即可使用。至于 Windows 平台,建议安装 Ubuntu 虚拟机。本文也需要读者具备基本的 VIM 基本常识和 Python 常识。

迁移到一个编辑器需要找到一些操作的 Emacs 替代操作。于是我安排文章结构如下:


  • [0x00. 基本软件环境安装](#0x00- 基本软件环境安装)
    • [0.1 zsh 与 ohmyzsh](#01-zsh- 与 -ohmyzsh)
    • [0.2 pyenv 与 pyenv virtualenv](#02-pyenv- 与 -pyenv-virtualenv)
    • [0.3 nvm 以及常用 npm 包](#03-nvm- 以及常用 -npm- 包)
    • [0.4 Spacemacs 安装以及基本配置](#04-spacemacs- 安装以及基本配置)
  • [0x01. 日常的编辑](#0x01- 日常的编辑)
  • [0x02. Python 编程](#0x02-python- 编程)
    • [2.1 代码补全](#21- 代码补全)
    • [2.2 代码跳转](#22- 代码跳转)
    • [2.3 pytest 测试](#23-pytest- 测试)
  • 0x03. IPython Notebook
  • [0x04. 扩展](#0x04- 扩展)

本文只负责把读者带入Spacemacs的世界中,而不是涉及到Spacemacs的方方面面,所以此文为指北.而非详细的指南(Guide).

0x00. 基本软件环境安装

0.1 zsh 与 ohmyzsh

brew install zsh
chsh -s /bin/zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

0.2 pyenv 与 pyenv virtualenv

git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

# 不喜写兼容代码,所有代码均向 3.5+ 靠拢
v=3.5.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=3.6.0|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
v=2.7.9|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v

# 设置 Global Python 为 2.7.9, 备注:尽量不要把 Py3 设置为全局,否则由于 Homebrew 本身有一些应用是依赖于 Py2 的,设置为Py2容易出现一些奇怪的问题。
pyenv global 2.7.9
pip install -i https://pypi.doubanio.com/simple requests
# 下面这个是用于安装基本的代码补全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy

pyenv virtualenv 3.5.2 py3-daily
pyenv activate py3-daily
pip install -i https://pypi.doubanio.com/simple requests
pip install -i https://pypi.doubanio.com/simple beatutifulsoup4
pip install -i https://pypi.doubanio.com/simple ipython[notebook]
pip install -i https://pypi.doubanio.com/simple jupyter
# 下面这个是用于安装基本的代码补全功能
pip install -i https://pypi.doubanio.com/simple --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5" flake8 pytest autoflake hy
pyenv deactivate
# pyenv uninstall py3-daily

0.3 nvm 以及常用 npm 包

# 安装 nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
nvm install 5.12.0
echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \
  --cache=$HOME/.npm/.cache/cnpm \
  --disturl=https://npm.taobao.org/dist \
  --userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc
npm install -g vmd
npm install -g gitbook-cli
npm install -g hexo-cli
npm install -g tern
npm install -g js-beautify
npm install -g js-hint

0.4 Spacemacs 安装以及基本配置

brew install ag
brew install grep
brew tap d12frosted/emacs-plus
brew install emacs-plus
# 安装完毕之后,克隆我的配置 repo, 有一些基本的配置用于解决墙的问题。解决方案来自于子龙山人
git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
mv ~/.spacemacs .spacemacs.bak
git clone https://github.com/twocucao/spacemacs.d.git ~/.spacemacs.d
# 输入 emacs 进行初始化,如果你可以正常访问 Github 的话时间在半小时之内。
emacs

安装 Spacemacs 过程中画面如下:

安装 Spacemacs 过程中画面

安装前,Emacs 长这个样子:

安装前

安装后,Emacs 长这个样子:

安装后.png

在正式进入,请牢牢记住下面几个按键已经功能,以备不时之需

  • spc : 跳出命令面板
  • spc-spc : 跳出命令列表,可运行命令,也可以查找快捷键
  • spc-h-spc : 查找包的用途与定义

嗯,可以谈下一话题了!

0x01. 日常的编辑

1.1 文件导航

  • (VIM 流)hjkloOaA zz
  • (VIM 流)查找 * /words
  • spc-f-j 开发 neotree
  • spc-tab 切换到上一个 buffer
  • spc-f-f 打开文件 spc-p-f fuzzfind 类似于 ctrlp spc-s-g-p grep 搜索项目 spc-s-a-p ag 搜索项目

搜索项目如图 (spc-s-a-p ag 搜索项目):

按照关键字搜索项目

实在是方便至极

1.2 文件编辑

文件内容编辑

  • (VIM 流)u 与 c-r d c 等
  • 有趣的是查找替换功能也是自带预览的。比如 :%s/foo/bar/g
查找替换预览

文件本身编辑

  • 在 dired mode 下:copy - C , delete - D, new folder - +
  • 也可以 spc-f-t 在 neotree 下进行编辑

除去这些和 Vim 相似的文件编辑功能之外,甚至窗口管理都和 Vim 一致了,使用 c-w+hjkl 直接跳转。
强烈建议在读者抽空过一遍基本的 Vimtutor

1.3 Markdown Writing

  • spc-spc-markdown-generate-to 回车即可生成本文的 Toc(Table Of Content)
  • spc-b-i 打开 buffer 的 imenu(类似于 Vim 的 Tagbar 插件),enter 跳转

搜索项目如图 (spc-b-i 开启 buffer imenu ,enter 跳转):

IMenu

0x02. Python 编程

2.1 代码补全

当你按照前面的所有配置走一圈下来,基本上就已经可以完美的进行补全了。
比如,当我编辑一个 py 文件的时候,

# 先激活虚拟环境
pyenv activate 3.5.2/envs/py3-daily
emacs py.py

如图所示,因为 requests,numpy 这种第三方库都可以完美补全,其他自然不在话下。

代码补全

代码补全还有另一个神器,就是可以内嵌 lisp 的 Snippet 模板 -- yasnippet, 由于模板功能基本上和其他编辑器相同,而使用 elisp 语言进行编写动态 Snippet 模板则需要会 elisp, 这以后有机会再学学。

2.2 代码跳转

  • 文件代码跳转 spc-spc-helm-imenu 查看文件结构
  • 文件跳转 在 normal-mode 下,gd 即可跳转到函数定义上,但是不能跨文件跳转。
单文件使用 helm_imenu 进行浏览 使用 ag 进行代码搜索

2.3 pytest 测试

  • spc-m-s-py3-daily enter 选择 py3-daily 虚拟环境
  • spc-spc-pytest-all enter 即可运行所有 pytest 测试。

测试过程:

运行测试失败,运行测试失败,使用 c-w-j 跳转到下面窗口,对红色标记处 enter, 即可跳转到出错文件行。

pytest 运行测试失败

修正运行测试成功,如图:

pytest 运行测试成功

0x03. IPython Notebook

通常情况下我使用 IPython Notebook 都是在 Web 端,因为是 Web 端,实际上大量的 Dom 渲染对浏览器的渲染速度还是有一定的影响的,我还是比较喜欢客户端,因为客户端的快捷键可以定制,而 Web 端的快捷键实在是相当的不方便。

是不是 IPython Notebook 的 web 端没有好处呢?有的,比如我可以借用外部的 JS 可视化图表对 js 进行可视化呀。

比如我发在简书上的这篇技术文 IPython Notebook 引入 ECharts 做可视化

但,如果不需要 js 功能的话,还是用客户端舒服一些。

3.1 IPython Notebook 基本配置

spacemacs 貌似只支持密码访问 IPython Notebook, 那么我们就生成密码。

# 首先激活 py3-daily 环境
python -c "from notebook.auth import passwd;print(passwd())" | pbcopy
# 恩,于是剪切板上就有如下的字符串
sha1:9bf4c48a6b83:26bc24a78a1e4aea7baa36874f5e86bafac0dbb9
# 打开 config 文件取消注释并修改 c.NotebookApp.password
vim ~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.password = 'sha1:35543659622f:f9a78f0b20132f3e04aa1d4ed4060f9fd9eb7663'

3.2 Emacs IPython Notebook

# 首先在终端打开 IPython Notebook
ipython notebook

接着打开 emacs, 输入 spc-a-i-n, 默认端口,然后输入密码即可。首次登陆后还需要在输入一次 spc-a-i-n 即可看到 IPython Notebook 的主界面。

IPYNB 的主界面

光标移到 [New Notebook] 键击 enter 新建 IPython Notebook.

输入如下代码:

# The %... is an iPython thing, and is not part of the Python language.
# In this case we're just telling the plotting library to draw things on
# the notebook, instead of on a separate window.
%matplotlib inline
# See all the "as ..." contructs? They're just aliasing the package names.
# That way we can call methods like plt.plot() instead of matplotlib.pyplot.plot().
import numpy as np
import scipy as sp
import matplotlib as mpl
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import pandas as pd
import time
pd.set_option('display.width', 1000)
pd.set_option('display.max_columns', 100)
pd.set_option('display.notebook_repr_html', True)
import seaborn as sns
sns.set_style("darkgrid")
sns.set_context("poster")
sns.set()

# Load the example flights dataset and conver to long-form
flights_long = sns.load_dataset("flights")
flights = flights_long.pivot("month", "year", "passengers")

# Draw a heatmap with the numeric values in each cell
sns.heatmap(flights, annot=True, fmt="d", linewidths=.5)

shift+enter , 咣

热力图就出来了

热力图

0x04. 扩展

看完上文,就可以深入文档进行探索了。

ChangeLog:

  • 2017-01-15 18:53:45 重修文字
  • 2017-01-16 12:49:19 润饰文字,增加可读性,首发简书。

相关文章

  • 写给 Pythonist 的 Spacemacs 入门指北

    前言 最开始,使用 Sublime Text 编码,后来用 Vim 混合 PyCharm 写 Python。 前几...

  • Pythoner 的 spacemacs 入门指北

    spacemacs 是什么? "Spacemacs is a new way to experience Emac...

  • Spacemacs入门

    Spacemacs入门 Spacemacs是什么 按照官方的说法,它是一个社区驱动的Emacs发行版。“最好的编辑...

  • 网址收藏

    vim vimscript vim 快捷键 spacemacs 有机会看一看 多光标 Emacs elisp入门 ...

  • spacemacs

    spacemacs很好用 最好在mac下用spacemacs spacemacs = vim + emacs s...

  • Emacs 腾讯源

    Emacs Spacemacs master 分支 添加下面的代码到.spacemacs的dotspacemacs...

  • Markdown入门“指北”

    记得第一次接触到Markdown是看见同事在用有道云笔记,然后用Markdown写,不知道是个什么东西,同事简单的...

  • git入门指北

    git是分布式版本控制系统,啥是分布式的呢,就是每一个用户的主机上都有一个版本库,可以在本地进行版本管理。如果需要...

  • Vim入门指北

    ======== 一些基本概念: operator(操作符): 例如命令d, y, c等; motion(移动):...

  • Realm入门指北

    简介 接触Realm已经有一段时间了,但是一直忙着项目,一直没有时间做一下笔记。趁着项目闲着之际,我开始着手记录我...

网友评论

  • XiaoTan呢:对了 博主有配置flycheck + pylint吗?我弄了好久 在virtualenv下总有问题OTL
    XiaoTan呢:@无与童比 谢谢
    无与童比:1. spacemacs 里面开启 syntax-checking 2. 开启虚拟环境,强烈建议pyenv 3. 安装必须依赖包,包括pylint 4. 初始化pylint 文件. https://github.com/twocucao/spacemacs.d/blob/8cff1f792b24a7f67f491c86b4f77a3092003e5a/init.el
  • XiaoTan呢:请问,在neotree和打开的文本之间光标跳转的快键键有吗?还是说一般都用手点。。

    BTW,文章的TOC好像生成的不太对劲 :joy:
    无与童比:ctrl+w-w是跳转窗口. 文章的TOC的确有问题. 我是先在Spacemacs中编辑然后拖出来放在vim中格式化了一下,结果就有的地方出现问题了.
  • Yi罐可乐:很详细!
  • 4b1a4ae90042:不了解emacs 是否vim也有相同环境呢
    无与童比:@simple_the_best :smile: 噗哈哈哈,你这个植入很恰当
    liuchengxu:我也非常喜欢 spacemacs 按照 spacemacs 的风格配置了一个 vim https://github.com/liuchengxu/space-vim ~
    无与童比:Vim相同环境指的是?

本文标题:写给 Pythonist 的 Spacemacs 入门指北

本文链接:https://www.haomeiwen.com/subject/xufybttx.html