优雅的在终端中编写Python无标题文章

前言

最早我也只是在服务器上编辑文件的时候用用vim来改改程序,并没有把vim当做自己的主力编辑器。但是偶然的一次机会需要改一个奇葩的输入文件的格式,用了下Vim的宏录制,尝到了甜头,于是后面就开始用Vim来写程序了,虽然使用初期有些阻力,但时间久了就会发现,双手再也不用离开键盘,即使使用sublime这样的编辑器我也要改成使用Vim模式,Vim真的能让自己一思维的速度编辑文本(对我来说就是写程序了)。

正好最近换了新的电脑,需要在新电脑上配置一下,就干脆把一些配置相关的东东记录下来吧,相关的配置文件我都放在了github(https://github.com/PytLab/dotfiles) 上并写了相应的安装和卸载脚本,给有需要的同学做个参考吧。

本文是有关配置的文章,并不对Vim的核心技巧进行说明,有需要的童鞋可以参考文档和相关书籍。这里主要配合tmux和vim可以更有优雅的帮助我们在终端中进行Python编程。

先来个大致的效果图吧:

vim-screeshot.png

正文

终端窗口管理工具Tmux

首先还是需要配置下tmux,它除了可以进行多window多panel以外最主要的是他提供了窗口组随时存储和恢复的功能。也可以帮助我们在一个窗口中使用多个panel一边使用vim一边在ipython中进行测试。

tmux的配置文件是当前用户主目录下的.tmux.conf文件,启动tmux时会自动加载,也可以通过在tmux中进行加载例如<prefix> : source ~/.tmux.conf

完整的配置文件参见: https://github.com/PytLab/dotfiles/blob/master/.tmux.conf

修改快捷键前缀

关于tmux的配置比较简单,我先把快捷键的前缀从Ctrl-b换成了Ctrl-l,主要是根据个人喜好,因为这样左手Ctrl右手l个人觉得比较方便。

# Set tmux prefix to <C-a>
set -g prefix C-l
unbind C-b

修改分屏快捷键

tmux的分屏快捷键默认值为:

  • <prefix> + " 水平分屏
  • <prefix> + % 垂直分屏

感觉好奇怪,我就改成了相对直观的方式:

  • <prefix> + |, 类似在屏幕上加一条处置线
  • <prefix> + -, 类似在屏幕上加一条水平线
# Split pane.
unbind '"'
bind | splitw -h
unbind '%'
bind - splitw -v

将复制模式改为vim的复制模式

由于使用vim习惯了而且不想在去碰鼠标,tmux也是可以将复制模式修改成同Vim相同的方式,只是操作的前缀不同罢了。

# Copy mode
# copy-mode to vi mode
setw -g mode-keys vi
# enter copy mode
bind Escape copy-mode
# paste buffer
bind C-p pasteb
# select (v)
bind -t vi-copy v begin-selection
# copy (y)
bind -t vi-copy y copy-selection

绑定面板切换快捷键

这里面板切换上,我将面板的上下左右方向绑定到了kjhl四个同Vim中光标移动一样的四个键上同Vim保持一致,这样就不需要在记住新的方向键了。

# Map panel switch.
# Up
bind-key k select-pane -U
# Down
bind-key j select-pane -D
# left
bind-key h select-pane -L
# right
bind-key l select-pane -R

修改面板大小的快捷键

这里为了能够将大小更灵活的移动,我将鼠标控制打开,这样就能通过鼠标进行方便精准的面板大小调整了。

# Resize panel size.
bind < resize-pane -L 10
bind > resize-pane -R 10
bind _ resize-pane -D 10
bind + resize-pane -U 10

# Use mouse to resize panel.
set -g mouse-utf8 on

配置当然要根据自己的使用习惯来设置,这里仅仅给出参考。这样我们将多窗口终端的控制玩弄于手掌之中啦。

tmux_panels.png

Vim配置

解决了终端窗口问题,我们开始大刀阔斧的捣鼓编辑器啦,这里我对我使用的几个Vim插件进行整理,以及几个基本配置进行下说明。

完整的vim配置文件参见: https://github.com/PytLab/dotfiles/blob/master/.vimrc

关于Vim安装

这里主要说一下在Mac上的Vim安装,Vim的官网以及YouCompleteMe的README都有推荐使用MacVim, 但是如果我们并不想在使用Vim的时候还打开新的窗口而是直接在终端使用Vim的话需要在安装MacVim后做一点小处理。

  1. 安装MacVim
brew cask install macvim
  1. 使用MacVim的mvim脚本覆盖掉系统自带的vim
alias vim='/usr/local/bin/mvim -v'
alias vi='vim'

自动给打开的文件添加头部

例如我们编写Python脚本的时候经常会在文件开头添加执行文件的Python路径以及文件的编码方式,我们可以通过在Vim的配置文件中添加一个函数,并让他在打开一个新的缓冲区的时候自动添加到头部。

" Auto add head info
" .py file into add header
function HeaderPython()
    call setline(1, "#!/usr/bin/env python")
    call append(1, "# -*- coding: utf-8 -*-")
    normal G
    normal o
endf
autocmd bufnewfile *.py call HeaderPython()

这样当我们使用

vi new.py

的时候便会匹配到文件后缀并执行头部添加函数进行内容添加, 其他语言的脚本例如bash、perl等都是类似的方式。

安装插件管理器Vundle

如果要安装插件,必须要有个方便的插件管理器,Vim的插件管理器有很多,这里我使用了Vundle,它的全称是Vim Bundle,可以让我们轻松的安装、更新、搜索和清理Vim插件。Vundle本身是一个Vim插件,所以使我们安装所有插件中最早需要安装的插件。

Vundle的安装方式这里就不详细介绍了,可以参见:https://github.com/VundleVim/Vundle.vim

安装好后我们需要修改下.vimrc文件:

set nocompatible
filetype off

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" 在这里添加你想安装的Vim插件

call vundle#end()            " required
filetype plugin indent on    " required

这样如果我们想安装插件的话我们只需要在call vundle#begin()call vundle#end()之间直接写入就好了,非常方便,写好后我们直接运行

vim +PluginInstall +qall

vundle便会自动下载并安装好插件,我们直接作为伸手党使用就好啦.

vim_plugin_install.png

自动补全神器YouCompleteMe

YouCompleteMe是一个非常强大的Vim自动补全插件,他的特别之处就在于他并不是像vim自带的Ctrl-xCtrl-n那样基于文本进行补全,而是基于语义,通过分析源文件进行语法分析,这得益于强大的clang/llvm。同时YCM也整合了多种插件,其中也包含语法纠错,类似Syntastic的功能,但是只能进行C/C++/Objective-C的语法检测,对于Python的话我们后面需要安装Syntastic插件。

YCM虽然强大,但是安装却稍微麻烦些,首先他文件比较大,另外需要自己进行编译(NeoVundle插件管理器貌似可以直接帮你自动编译), 不过无论我之前在ubuntu还是现在的mac上,至少我还是没有遇到什么很大的问题的。

具体的安装请参考YCM的安装说明: https://github.com/Valloric/YouCompleteMe#installation

YCM的相关设置:

" Plugin YCM settings.
set completeopt=longest,menu
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_cache_omnifunc=0
let g:ycm_seed_identifiers_with_syntax=1
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
let g:syntastic_check_on_open=1
let g:syntastic_enable_signs=1
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_remove_include_errors = 1

YCM除了在.vimrc中进行配置外,还有一个Python的配置文件.ycm_extra_conf.py,在里面我们可以设置相应的编译选项,比如编译参数,头文件和库文件的地址等等,这样我们在编写C/C++等的时候ycm会找到相应的头文件和库文件进行编译并给出相应的提示。这个文件需要根据自己的项目根据自己的文件位置进行自定义。

我的.ycm_extra_conf.py的完整版:https://github.com/PytLab/dotfiles/blob/master/.ycm_extra_conf.py

ycm_complete.png

为Python的缩进助力

写Python的时候你一定需要一款帮助你显示缩进的插件,indentLine就是一款提供缩指示线的插件,有纯文字实现,有了他在判断Python代码块的时候就方便了许多。

插件地址:https://github.com/Yggdroot/indentLine

我相应的配置:

" Plugin indentLine settings.
let g:indentLine_char = "┆"
let g:indentLine_enabled = 1
let g:autopep8_disable_show_diff=1

效果:

indent_line.png

对打开的多个文件进行操作

当我们写代码的时候不可能每次只打开一个文件,而是打开很多个,而且要经常在这之间来回切换。vim提供了自己的buffer管理工具,但是并不直观,这时可以使用minibufexplorer插件,这样便可以像切换tab一样在Vim中进行buffer的切换来同时编辑多个文件。

效果如下图:

bufexplorer.png

我们可以通过根据前面的buffer序号来使用Ctrl+w :b buffer-number来快速切换。

使用Pylint来帮助我们进行Python语法检测

首先Pylint是一个代码分析工具,它能够分析Python中的代码错误,查找不符合风格标准(默认PEP8)和有潜在问题的代码,如果单独使用的话,他还可以为我们的Python代码进行检测并生成一份报告,并为你的代码进行评分,像这样:

pylint incar.py --output-format=html > score.html
pylint_score.png

我们可以利用syntastic插件来使用pylint帮助我们进行语法检查。

syntastic的安装可以直接通过Vundle来进行方便的安装,安装后我们需要进行下配置:

" Plugin syntastic settings.
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = {'mode': 'passive', 'active_filetypes': [], 'passive_filetypes': []}
" Use pylint to check python files.
let g:syntastic_python_checkers = ['pylint']
map <F5> :SyntasticToggleMode<CR> :SyntasticCheck<CR>

" Ignore warnings about newlines trailing.
let g:syntastic_quiet_messages = { 'regex': ['trailing-newlines', 'invalid-name',
    \'too-many-lines', 'too-many-instance-attributes', 'too-many-public-methods',
    \'too-many-locals', 'too-many-branches'] }

这里主要涉及两个部分的配置,

  1. 一个是将检测模式改成被动,由于Syntastic检测并不是异步进行的,如果每次保存的时候都进行检测,都会卡在那里等一会,如果我的代码比较大的话会更久,所以我们在想要检测的时候在检测。
  2. 忽略掉一些我们不想看到的warnign,pylint完全按照PEP8来的话,我的代码经常会各种提示的warning,比如我喜欢在代码最后一行留个空行也会有提示,因此我就通过正则表达式将次信息过滤掉,这时候就需要设置syntastic_quiet_message变量了。
syntastic_warning.png

树形目录方便文件查看

像其他IDE一样,左边有树形目录的话,所有文件夹和文件都一目了然那一定是极好的,所以NERDTree插件就是这么一款工具,他可以直接通过Vundle进行安装,然后在配置文件中设置启动的快捷键以及窗口大小和忽略显示的文件等等。

" Plugin nerdtree settings.
map <F2> :NERDTreeToggle<CR>
let NERDTreeChDirMode=1
let NERDTreeShowBookmarks=1
let NERDTreeWinSize=25
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$', '\.git$']
nerdtree.png

在项目中迅速定位文件

ctrlp.vim 顾名思义,就是提供了同Sublime的Ctrl+p的功能,可以直接通过Vundle安装,在配置文件中将其映射到功能键上便可以快速启动搜索,支持模糊匹配。

map <F3> :CtrlP<CR>
ctrlp.png

显示文件中的类、函数、变量

tagbar插件可以帮助我们显示当前文件中的类、函数、变量等,方便我们阅读代码,它是基于ctags的,支持很多语言,具体详见:https://github.com/majutsushi/tagbar/wiki

安装好ctags之后可以直接从Vundle中进行安装。

在配置文件中可以将其绑定到快捷键上方便快速启动。

map <F2> :TagbarToggle<CR>

效果如下:

tagbar.png

其他插件

Vim 的插件很丰富,这里我就不再一一赘述了,希望这些强大的工具能让我们在终端中更优雅的编写Python(不限于Python啦),有关我使用的vim插件都在我的.vimrc中,有兴趣的童鞋可以搜索相应的插件名称进行查看。

" Plugins.
Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'Yggdroot/indentLine'
Plugin 'scrooloose/nerdtree'
Plugin 'ctrlpvim/ctrlp.vim'
Plugin 'majutsushi/tagbar'
Plugin 'dyng/ctrlsf.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'MattesGroeger/vim-bookmarks'
Plugin 'vim-syntastic/syntastic'

同时为了方便自己我也写了相应的安装和卸载脚本,方便大家参考,github地址:https://github.com/PytLab/dotfiles

总结

本文主要简单介绍下本人平时编程中使用tmux,vim等工具的配置,希望能借此帮助大家能更好的在终端中进行程序编写提高工作效率。

最后还是建议配置文件中不要盲目复制粘贴别人的配置,最好保证里面的配置自己都知道是做什么的,而且是对自己需要的。

本文作者:PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。
blog:http://ipytlab.com
github:https://github.com/PytLab

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容