打造自己的Python编码环境

【前言】

趁着放假,重新配置了一下自己的Mac的编程环境,毕竟新年新气象嘛,主要是iTerm2、Zsh、Vim优化、Consolas字体、NoisyTyper,这些的相关配置。工欲利其事必先利其器,好的编码环境可以提升我们的打码的幸福感。好的编码环境包括美观(视觉),声音(听觉),流畅度(触觉),工作环境(嗅觉,味觉)等多个方面。后面有几张配置后的图片感受一下,主要看字体和配色(有些人可能觉得比较丑,个人喜欢黑紫,配色和字体有很多选择,各有所好,求别喷 XD)

Zsh效果
此处输入图片的描述

Vim效果
此处输入图片的描述

【准备阶段:器】

iTerm2:是os系统中的一个替代终端。主要优点:屏幕分割(可以水平分割和垂直分割),选中即复制,快速查找(command+f),配色字体自定义化,自定义快捷键等。

Consolas:微软下最好看的字体之一,个人认为很适合程序员,除开字体好看外,主要原因是它的数字“0”字加入了一斜撇,以方便与字母“o”分辨。这也是我和它结缘的主要缘由,当年在某次acm比赛中,就是因为肉眼无法分辨是0还是o,遗憾至今。

Zsh:zsh和bash一样是Shell的一种。相比bash:更高效、更好的自动补全、更好的文件名展开(通配符展开)、更好的数组处理、可定制性高。mac下自带了zsh,无需再安装。

Vim:是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。和Emacs并列成为类Unix系统用户最喜欢的编辑器。估计大家都很熟悉,不做累述。

NoisyTyper:一款提升你打字逼格的软件,可以让你打字的时候发出打字机的声音,咔咔咔这样。

上面几个安装都比较简单,教程也比较多。这里主要讲一下mac下consolas字体的安装。

1
2
3
4
5
6
7
8
$ brew install cabextract
$ cd ~/Downloads
$ mkdir consolas
$ cd consolas
$ curl -O http://download.microsoft.com/download/f/5/a/f5a3df76-d856-4a61-a6bd-722f52a5be26/PowerPointViewer.exe
$ cabextract PowerPointViewer.exe
$ cabextract ppviewer.cab
$ open CONSOLA*.TTF

最后按下弹出窗口的安装键就ok了。

【打磨阶段:利器】

上面的工具准备好了后,就可以开始配置这些工具了。

Zsh配置

oh-my-zsh:一套强大的开源zsh配置文件。安装如下:

1
2
3
4
5
6
// 使用curl安装
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
// 或者使用wget安装
$ sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
// 安装后重新载入配置
$ source .zshrc

oh-my-zsh主题: oh-my-zsh有多款配套主题,点击前面的主题链接可以看到所有主题。这里主要介绍下agnoster主题。修改zsh配置文件(~/.zshrc)中的主题属性为agnoster即可。官方图如下:
此处输入图片的描述

安装这个主题需要额外安装powerline字体,不然会显示乱码。如果你想隐藏自己的用户名信息,需要在zsh配置文件中设置默认用户。具体安装配置如下:

1
2
3
4
5
6
7
8
9
10
// 修改zsh配置文件
$ vim ~/.zshrc
ZSH_THEME="agnoster" //在.zshrc中修改ZSH_THEME
DEFAULT_USER=username // 在.zshrc中添加或者修改默认用户为自己,开启终端后就不会显示自己的用户名信息
$ source ~/.zshrc // 重新载入配置文件

// poweline font 安装
$ git clone https://github.com/powerline/fonts.git
$ cd powerline
$ ./install.sh

iTerm2配置

字体:接着要在iterm2的Perferences中Text中选择常规字体 为consolas字体或者其他你喜欢的字体,非ASCII码字体为powerline字体(一定要是名字中带powerline的字体,不然还是乱码)。如下:
此处输入图片的描述

iTerm2配色:从这里可以获取很多别人的配色主题,把整个项目git clone下来,然后在iterm2的Perferences中的Colors最下面的Load Presets中import git下来的schemes文件夹里面itermcolors后缀的文件,自己可以根据自己喜欢调整自己喜欢的颜色,我选的是Fish Tank,我自己微调了一些配色。如下:
此处输入图片的描述

Vim配置
之前一直用spf13,但是打开大文件太卡了,所以自己重新配置了一份。实测打开8000+行代码的文件,因为语法检测,所以大概延时1s左右,之后操作很顺畅。在配置过程中会遇到很多蛋疼的地方。需要比较系统的学习一下vim脚本的语法和相关配置方法,vim网上很多配置好文,如《像 IDE 一样使用 vim》,还有《vim 脚本学习文档》,我就不累述了,配置文件的注释写的比较详细。我的配置主要针对python开发,另外需要额外安装python包flake8。具体如下:

vimrc文件,主要是vim基础配置。(highlight.js不支持vim script,有点蛋疼)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
" 相关vim脚本文档 http://vimdoc.sourceforge.net
" 相关好文 https://github.com/yangyangwithgnu/use_vim_as_ide
" 导入vim插件管理文件
if filereadable(expand("~/.vimrc.bundles"))
source ~/.vimrc.bundles
endif

" 基本配置
set nocompatible "不要vim模仿vi模式,建议设置,否则会有很多不兼容的问题
set mouse=a " 启动鼠标所有模式,但是右键功能不可用, 可以保证鼠标滚屏在当前屏幕内
set mousehide " 输入文件时隐藏鼠标
set backspace=indent,eol,start " 退格键分别可删除缩进,上一行结束,insert之前的字
set showmatch " 设置匹配模式
set nobackup " 不备份
set nowritebackup " 不写入备份文件
set noswapfile " 关闭交换文件
set history=500 " history存储长
set ruler " 显示标尺
set showcmd " 显示输入命令
set incsearch " 搜索时自动匹配
set hlsearch " 高亮搜索项
set ignorecase " 无视大小写
set smartcase " 如果有大写就区别大小写匹配
set laststatus=2 " 总是显示状态栏
" set autowrite " 切换文件自动保存 https://github.com/terryma/vim-multiple-cursors/raw/master/assets/example1.gif?raw=true
set shortmess=atI" " 关闭欢迎页面
set viewoptions=cursor,folds,slash,unix " viminfo 记录的内容
set virtualedit=onemore " 光标可以移到当行最后一个字符之后
set hidden " 切换文件不保存,隐藏
"set confirm " 退出前验证
" set spell " 拼写检查
set linespace=0 " 行之间没有多余的空格
set wildmenu " 自动补全时的文件菜单
set wildmode=list:longest,full " 自动补全时,匹配最长子串,列出文件
set whichwrap=b,s,h,l,<,>,[,] " 行尾可右移到下行,行首左移到上行,b:退格,s:空格,hl:左右,<>:n/v模式下的左右,[]:i/r模式下的左右
set scrolljump=5 " 光标离开屏幕范围
set scrolloff=3 " 光标移动至少保留行数

" 格式
set nowrap " 取消自动折行
"set smarttab
set tabstop=4 " tab=4空格
set softtabstop=4 " 回退可以删除缩进
set shiftwidth=4 " 缩进位宽=4个空格位
set autoindent " 自动缩进
set expandtab " tab由空格表示

set nojoinspaces " 用J合并两行用一个空格隔开
set splitright " 用vsplit新建窗口,让新的放右边
set splitbelow " 用split新建窗口,让新的放下面
set pastetoggle=<F12> " 指定F12进入黏贴模式,可以正常复制缩进
set iskeyword-=. " 让'.' 作为单词分割符
set iskeyword-=# " 让'#' 作为单词分割符
set iskeyword-=- " 让'-' 作为单词分割符
set listchars=tab:›\ ,trail:•,extends:#,nbsp:. " 空格等无效字符显示
set textwidth=80 " 内容宽度
set fileencodings=utf-8,gb18030,gbk,big5 " 文件编码

" 开启新的buffer时,自动转到对应文件目录
let g:autochdir = 1
if exists('g:autochdir')
autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | lcd %:p:h | endif
endif

" 设置u的返回步数限制
if has('persistent_undo')
set undofile " 开启u回滚文件记录
set undolevels=1000 " 最大数量的改变回滚
set undoreload=10000 " 最大数量重载可回滚行数
endif

" 特殊文件打开
autocmd BufNewFile,BufRead *.py,*.pyw set filetype=python
autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig
autocmd FileType haskell setlocal expandtab shiftwidth=2 softtabstop=2
autocmd BufNewFile,BufRead *.coffee set filetype=coffee
autocmd FileType haskell setlocal commentstring=--\ %s
autocmd FileType haskell setlocal nospell

" key 映射
let mapleader = ',' " 全局leader设置
let maplocalleader = '_' " 本地leader设置

" 设置tag和window间快速跳转
let g:easyWindows = 1
if exists('g:easyWindows')
" 向上
map <C-J> <C-W>j<C-W>_
" 向下
map <C-K> <C-W>k<C-W>_
" 向右
map <C-L> <C-W>l<C-W>_
" 向左
map <C-H> <C-W>h<C-W>_
endif

" 处理折叠行的左右移动
noremap j gj
noremap k gk

" 没sudo却想保存
cmap w!! w !sudo tee % >/dev/null

" ,fc查找冲突的地方
map <leader>fc /\v^[<\|=>]{7}( .*\|$)<CR>

" ,ff 查找光标后的单词位置,列出选择项
nmap <Leader>ff [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[\t"<CR>

" 屏幕左移和右移
map zl zL
map zh zH

" 映射vsp这些开启新的buffer,默认目录为当前目录
cnoremap %% <C-R>=fnameescape(expand('%:h')).'/'<cr>
map <leader>ew :e %%
map <leader>es :sp %%
map <leader>ev :vsp %%
map <leader>et :tabe %%

" 黏贴板
if has('clipboard')
if has('unnamedplus')
set clipboard=unnamedplus
else
set clipboard=unnamed
endif
endif

"字体的设置
set guifont=Consolas,Bitstream_Vera_Sans_Mono:h9:cANSI "设置gui下的字体
set gfw=幼圆:h10:cGB2312

" 语法高亮
syntax on

" 缩进和md文件
filetype plugin indent on " 自动根据类型启动对应插件,缩进开启

" 设置主题,UI
" solarized 主题
set background=dark
if filereadable(expand("~/.vim/bundle/vim-colors-solarized/colors/solarized.vim"))
let g:solarized_termcolors=256
let g:solarized_termtrans=1
let g:solarized_contrast="normal"
let g:solarized_visibility="normal"
color solarized " Load a colorscheme
endif


set cursorline " 选中行高亮
autocmd BufEnter *.py set cc=81 " 打开py文件81行高亮
" 之前的高亮线太难看,重新制定颜色,这里的black和iterm2颜色配置中的black一样
hi CursorLine cterm=NONE ctermbg=black guibg=black
hi CursorColumn cterm=NONE ctermbg=black guibg=black "
highlight ColorColumn ctermbg=black guibg=black
set number " 设置行号
hi LineNr ctermbg=black

" Indent Guides 缩进列对齐线
let g:indent_guides_start_level = 2
let g:indent_guides_guide_size = 1
let g:indent_guides_enable_on_vim_startup = 1

" airline 就是状态栏的箭头
let g:airline_theme="dark"
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1

" NerdTree配置 control+e打开当前文件目录树
map <C-e> :NERDTreeToggle<CR>
map <leader>ee :NERDTreeToggle<CR>
nmap <leader>nt :NERDTreeFind<CR>

let NERDTreeShowBookmarks=1
let NERDTreeIgnore=['\.pyc', '\~$', '\.swo$', '\.swp$', '\.git', '\.hg', '\.svn', '\.bzr']
let NERDTreeChDirMode=0
let NERDTreeQuitOnOpen=1
let NERDTreeMouseMode=2
let NERDTreeShowHidden=1
let NERDTreeKeepTreeInNewTab=1
let g:nerdtree_tabs_open_on_gui_startup=0

" syntastic 配置
" 设置每次w保存后语法检查
function! ToggleErrors()
Errors
endfunction
let g:syntastic_check_on_open=1
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_wq = 0
let syntastic_loc_list_height = 5
let g:syntastic_html_tidy_ignore_errors=[" proprietary attribute \"ng-"]
autocmd WinEnter * if &buftype ==#'quickfix' && winnr('$') == 1 | quit |endif
autocmd WinLeave * lclose

" 自动补全tab触发
function! InsertTabWrapper()
let col = col('.') - 1
if !col || getline('.')[col - 1] !~ '\k'
return "\<tab>"
else
return "\<c-p>"
endif
endfunction
inoremap <Tab> <c-r>=InsertTabWrapper()<cr>
inoremap <S-Tab> <c-n>

" Ctrlp 和 Ctrlp-funky(,fu)
if isdirectory(expand("~/.vim/bundle/ctrlp.vim/"))
let g:ctrlp_working_path_mode = 'ra'
nnoremap <silent> <D-t> :CtrlP<CR>
nnoremap <silent> <D-r> :CtrlPMRU<CR>
let g:ctrlp_custom_ignore = {
\ 'dir': '\.git$\|\.hg$\|\.svn$',
\ 'file': '\.exe$\|\.so$\|\.dll$\|\.pyc$' }

if executable('ag')
let s:ctrlp_fallback = 'ag %s --nocolor -l -g ""'
elseif executable('ack-grep')
let s:ctrlp_fallback = 'ack-grep %s --nocolor -f'
elseif executable('ack')
let s:ctrlp_fallback = 'ack %s --nocolor -f'
" On Windows use "dir" as fallback command.
else
let s:ctrlp_fallback = 'find %s -type f'
endif
if exists("g:ctrlp_user_command")
unlet g:ctrlp_user_command
endif
let g:ctrlp_user_command = {
\ 'types': {
\ 1: ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others'],
\ 2: ['.hg', 'hg --cwd %s locate -I .'],
\ },
\ 'fallback': s:ctrlp_fallback
\ }

if isdirectory(expand("~/.vim/bundle/ctrlp-funky/"))
" CtrlP extensions
let g:ctrlp_extensions = ['funky']
"funky
nnoremap <Leader>fu :CtrlPFunky<Cr>
endif
endif

" complete
autocmd Filetype * if &omnifunc == "" | setlocal omnifunc=syntaxcomplete#Complete | endif
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete

"进行版权声明的设置
"添加或更新头
map <F4> :call TitleDet()<cr>'s
autocmd BufNewFile *.py :call AddTitle()
function AddTitle()
call append(0,"#! /usr/bin/env python")
call append(1,"# -*- coding: utf-8 -*-")
call append(2,"# vim:fenc=utf-8")
call append(3,"# Copyright © XYM")
call append(4,"# CreateTime: ".strftime("%Y-%m-%d %H:%M:%S"))
call append(5,"")
endf

let python_highlight_all = 1

vimrc.bundles文件,主要是vim相关插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
if &compatible
set nocompatible
end

filetype off
set rtp+=~/.vim/bundle/vundle
call vundle#rc()
Bundle "gmarik/vundle"
" 星级越多越推荐, 5星为必选,4星强烈推荐,3星比较推荐
" 文件模糊匹配查找 推荐:****
Bundle "kien/ctrlp.vim"

" 函数模糊匹配查找(,fu) 推荐:****
Bundle 'tacahiroy/ctrlp-funky'

" 文件索引树 推荐:*****
Bundle "scrooloose/nerdtree"

" 自动注释 推荐:*****
Bundle 'scrooloose/nerdcommenter'

" 语法检查 推荐:****
Bundle "scrooloose/syntastic"

" 括号自动匹配 推荐:****
Bundle 'jiangmiao/auto-pairs'

" 引号处理 推荐:****
Bundle 'tpope/vim-surround'

" 光标多行编辑 <C-n> <C-x> <C-p> 推荐:****
Bundle 'terryma/vim-multiple-cursors'

" 配色主题 推荐:****
Bundle "altercation/vim-colors-solarized"

" 缩进引导线 推荐:****
Bundle "nathanaelkane/vim-indent-guides"

" 文本同级文字选取,和文本处理 推荐:****
Bundle 'kana/vim-textobj-indent'

Bundle 'kana/vim-textobj-user'
" 保存vim编辑信息,比如最后的位置 推荐:****
Bundle "vim-scripts/restore_view.vim"


" 状态栏效果 推荐:***
Bundle "bling/vim-airline"


" python 推荐:****
Bundle 'yssource/python.vim'

Bundle 'python_match.vim'
Bundle 'pythoncomplete'
Bundle 'hdima/python-syntax'
Bundle 'hynek/vim-python-pep8-indent'

" js 推荐:****
Bundle 'elzr/vim-json'

Bundle 'groenewege/vim-less'
Bundle 'pangloss/vim-javascript'
Bundle 'briancollins/vim-jst'
Bundle 'kchmck/vim-coffee-script'

" html 推荐:****
Bundle 'amirh/HTML-AutoCloseTag'

Bundle 'hail2u/vim-css3-syntax'
Bundle 'gorodinskiy/vim-coloresque'
Bundle 'tpope/vim-haml'
Bundle 'mattn/emmet-vim'

if filereadable(expand("~/.vimrc.bundles.local"))
source ~/.vimrc.bundles.local
endif
filetype on

【总结】

一个好的程序员必须善用各种工具提升自己的开发效率,和提升自己的幸福指数。另外,个人觉得vim还是值得自己重新一配的,我的配置过程基本都是在读spf13的配置,读懂,然后选取,可是中间还是出了很多问题,比如因为我没有用pymode插件,所以在用括syntastic的local_list在退出或者分屏时的位置,都令我很蛋疼。而且在读spf13配置时,会发现有很多很好的功能都没有用上,比如paste模式,查找冲突快捷键,屏幕移动,还有ctrlp-funky,vim-multiple-cursors这些很爽的插件。大家有好的配置可以推荐给我。

文章目录
  1. 1. 【前言】
  2. 2. 【准备阶段:器】
  3. 3. 【打磨阶段:利器】
  4. 4. 【总结】
,