分享

打造自己的Python编码环境

 立志德美 2019-06-02

趁着放假,重新配置了一下自己的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字体的安装。

$ 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配置文件。安装如下:

// 使用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配置文件中设置默认用户。具体安装配置如下:

// 修改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,有点蛋疼)

' 相关vim脚本文档 http://vimdoc.

' 相关好文 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 /^[<|=>]{7}( .*|$)<CR>

' ,ff 查找光标后的单词位置,列出选择项

nmap <Leader>ff [I:let nr = input('Which one: ')<Bar>exe 'normal ' . nr .'['<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相关插件

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这些很爽的插件。大家有好的配置可以推荐给我。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约