寫給 Pythonist 的 Spacemacs 入門指北

前言

最開始寞冯,使用 Sublime Text 編碼吮龄,后來用 Vim 混合 PyCharm 寫 Python咆疗。

前幾天午磁,Github 上的 Spacemacs 已經(jīng)成功的突破一萬 Star, 聽說幾個我非常佩服的 Pythoner(比如『Python Web 開發(fā)實戰(zhàn)』的作者董偉明) 也是非常喜歡 Spacemacs, 我就萌生了從 Vim 切換到 Spacemacs 的想法,說做就做衙熔。

注:本文所有內(nèi)容基于 macOS 10.11, 軟件環(huán)境為 zsh , pyenv , python3.5.2 , node5.12.0. 其他類 Unix 平臺略作修改即可使用红氯。至于 Windows 平臺,建議安裝 Ubuntu 虛擬機塞栅。本文也需要讀者具備基本的 VIM 基本常識和 Python 常識放椰。

遷移到一個編輯器需要找到一些操作的 Emacs 替代操作庄敛。于是我安排文章結(jié)構(gòu)如下:


  • [0x00. 基本軟件環(huán)境安裝](#0x00- 基本軟件環(huán)境安裝)
    • [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- 日常的編輯)
    • [1.1 文件導(dǎo)航](#11- 文件導(dǎo)航)
    • [1.2 文件編輯](#12- 文件編輯)
    • 1.3 Markdown Writing
  • [0x02. Python 編程](#0x02-python- 編程)
    • [2.1 代碼補全](#21- 代碼補全)
    • [2.2 代碼跳轉(zhuǎn)](#22- 代碼跳轉(zhuǎn))
    • [2.3 pytest 測試](#23-pytest- 測試)
  • 0x03. IPython Notebook
  • [0x04. 擴展](#0x04- 擴展)

本文只負責(zé)把讀者帶入Spacemacs的世界中,而不是涉及到Spacemacs的方方面面,所以此文為指北.而非詳細的指南(Guide).

0x00. 基本軟件環(huán)境安裝

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

# 設(shè)置 Global Python 為 2.7.9, 備注:盡量不要把 Py3 設(shè)置為全局兴猩,否則由于 Homebrew 本身有一些應(yīng)用是依賴于 Py2 的倾芝,設(shè)置為Py2容易出現(xiàn)一些奇怪的問題。
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 的話時間在半小時之內(nèi)莫瞬。
emacs

安裝 Spacemacs 過程中畫面如下:

安裝 Spacemacs 過程中畫面

安裝前,Emacs 長這個樣子:

安裝前

安裝后,Emacs 長這個樣子:

安裝后.png

在正式進入,請牢牢記住下面幾個按鍵已經(jīng)功能吉嚣,以備不時之需

  • spc : 跳出命令面板
  • spc-spc : 跳出命令列表秉撇,可運行命令琐馆,也可以查找快捷鍵
  • spc-h-spc : 查找包的用途與定義

嗯,可以談下一話題了歧胁!

0x01. 日常的編輯

1.1 文件導(dǎo)航

  • (VIM 流)hjkloOaA zz
  • (VIM 流)查找 * /words
  • spc-f-j 開發(fā) 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 搜索項目):

按照關(guān)鍵字搜索項目

實在是方便至極

1.2 文件編輯

文件內(nèi)容編輯

  • (VIM 流)u 與 c-r d c 等
  • 有趣的是查找替換功能也是自帶預(yù)覽的滋饲。比如 :%s/foo/bar/g
查找替換預(yù)覽

文件本身編輯

  • 在 dired mode 下:copy - C , delete - D, new folder - +
  • 也可以 spc-f-t 在 neotree 下進行編輯

除去這些和 Vim 相似的文件編輯功能之外,甚至窗口管理都和 Vim 一致了喊巍,使用 c-w+hjkl 直接跳轉(zhuǎn)屠缭。
強烈建議在讀者抽空過一遍基本的 Vimtutor

1.3 Markdown Writing

  • spc-spc-markdown-generate-to 回車即可生成本文的 Toc(Table Of Content)
  • spc-b-i 打開 buffer 的 imenu(類似于 Vim 的 Tagbar 插件),enter 跳轉(zhuǎn)

搜索項目如圖 (spc-b-i 開啟 buffer imenu 崭参,enter 跳轉(zhuǎn)):

IMenu

0x02. Python 編程

2.1 代碼補全

當你按照前面的所有配置走一圈下來勿她,基本上就已經(jīng)可以完美的進行補全了。
比如阵翎,當我編輯一個 py 文件的時候逢并,

# 先激活虛擬環(huán)境
pyenv activate 3.5.2/envs/py3-daily
emacs py.py

如圖所示玻蝌,因為 requests,numpy 這種第三方庫都可以完美補全,其他自然不在話下陋率。

代碼補全

代碼補全還有另一個神器,就是可以內(nèi)嵌 lisp 的 Snippet 模板 -- yasnippet, 由于模板功能基本上和其他編輯器相同址遇,而使用 elisp 語言進行編寫動態(tài) Snippet 模板則需要會 elisp, 這以后有機會再學(xué)學(xué)。

2.2 代碼跳轉(zhuǎn)

  • 文件代碼跳轉(zhuǎn) spc-spc-helm-imenu 查看文件結(jié)構(gòu)
  • 文件跳轉(zhuǎn) 在 normal-mode 下,gd 即可跳轉(zhuǎn)到函數(shù)定義上,但是不能跨文件跳轉(zhuǎn)呼胚。
單文件使用 helm_imenu 進行瀏覽
使用 ag 進行代碼搜索

2.3 pytest 測試

  • spc-m-s-py3-daily enter 選擇 py3-daily 虛擬環(huán)境
  • spc-spc-pytest-all enter 即可運行所有 pytest 測試厨幻。

測試過程:

運行測試失敗漠另,運行測試失敗满败,使用 c-w-j 跳轉(zhuǎn)到下面窗口,對紅色標記處 enter, 即可跳轉(zhuǎn)到出錯文件行。

pytest 運行測試失敗

修正運行測試成功架谎,如圖:

pytest 運行測試成功

0x03. IPython Notebook

通常情況下我使用 IPython Notebook 都是在 Web 端在塔,因為是 Web 端,實際上大量的 Dom 渲染對瀏覽器的渲染速度還是有一定的影響的,我還是比較喜歡客戶端,因為客戶端的快捷鍵可以定制偎捎,而 Web 端的快捷鍵實在是相當?shù)牟环奖恪?/p>

是不是 IPython Notebook 的 web 端沒有好處呢败京?有的晶姊,比如我可以借用外部的 JS 可視化圖表對 js 進行可視化呀。

比如我發(fā)在簡書上的這篇技術(shù)文 IPython Notebook 引入 ECharts 做可視化

但忆蚀,如果不需要 js 功能的話,還是用客戶端舒服一些察皇。

3.1 IPython Notebook 基本配置

spacemacs 貌似只支持密碼訪問 IPython Notebook, 那么我們就生成密碼。

# 首先激活 py3-daily 環(huán)境
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 潤飾文字,增加可讀性侯繁,首發(fā)簡書胖喳。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贮竟,隨后出現(xiàn)的幾起案子丽焊,更是在濱河造成了極大的恐慌,老刑警劉巖咕别,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技健,死亡現(xiàn)場離奇詭異,居然都是意外死亡惰拱,警方通過查閱死者的電腦和手機雌贱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偿短,“玉大人欣孤,你說我怎么就攤上這事∥舳海” “怎么了降传?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勾怒。 經(jīng)常有香客問我婆排,道長款票,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任泽论,我火速辦了婚禮艾少,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翼悴。我一直安慰自己缚够,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布鹦赎。 她就那樣靜靜地躺著谍椅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古话。 梳的紋絲不亂的頭發(fā)上雏吭,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音陪踩,去河邊找鬼杖们。 笑死,一個胖子當著我的面吹牛肩狂,可吹牛的內(nèi)容都是我干的摘完。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼傻谁,長吁一口氣:“原來是場噩夢啊……” “哼孝治!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起审磁,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤谈飒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后态蒂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杭措,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年吃媒,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓤介。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕喘。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赘那,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氯质,到底是詐尸還是另有隱情募舟,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布闻察,位于F島的核電站拱礁,受9級特大地震影響琢锋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呢灶,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一吴超、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸯乃,春花似錦鲸阻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奖年,卻和暖如春细诸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陋守。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工震贵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人水评。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓屏歹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親之碗。 傳聞我的和親對象是個殘疾皇子蝙眶,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容