专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python中文社区  ·  超爆回报2682%!轻松复制这个简单暴利的量 ... ·  昨天  
Python爱好者社区  ·  模仿一下领导说话的样子 ·  15 小时前  
Python爱好者社区  ·  今年程序员这薪资是认真的吗? ·  昨天  
python自留地  ·  Python语法基本单词 ·  昨天  
Python中文社区  ·  马斯克一条推特,股价狂飙?AI量化模型揭秘背 ... ·  4 天前  
51好读  ›  专栏  ›  Python中文社区

优雅的在终端中编写Python

Python中文社区  · 公众号  · Python  · 2017-03-28 23:39

正文

專 欄

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

blog: http://ipytlab.com

github: https://github.com/PytLab

前言

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

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

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

先来个大致的效果图吧:

终端窗口管理工具Tmux

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

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

完整的配置文件参见: PytLab/dotfiles

修改快捷键前缀

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

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

修改分屏快捷键

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

  • + " 水平分屏

  • + % 垂直分屏

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

  • + |, 类似在屏幕上加一条处置线

  • + -, 类似在屏幕上加一条水平线

# Split pane.
unbind '"'
bind | splitw -h
unbind '%'
bind - splitw -v

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

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

# Copy mode# copy-mode to vi modesetw -g mode-keys vi# enter copy modebind Escape copy-mode# paste bufferbind 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 10bind > resize-pane -R 10bind _ resize-pane -D 10bind + resize-pane -U 10# Use mouse to resize panel.set -g mouse-utf8 on

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

Vim配置

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

完整的vim配置文件参见: PytLab/dotfiles

关于Vim安装

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

安装MacVim

brew cask install macvim

使用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的安装方式这里就不详细介绍了,可以参见: VundleVim/Vundle.vim

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

set nocompatiblefiletype offset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()" 在这里添加你想安装的Vim插件call vundle#end()            " requiredfiletype plugin indent on    " required

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

vim +PluginInstall +qall

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

自动补全神器YouCompleteMe

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

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

具体的安装请参考YCM的安装说明: Valloric/YouCompleteMe

YCM的相关设置:

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

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

我的.ycm_extra_conf.py的完整版: github.com/PytLab/dotfi

为Python的缩进助力

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

插件地址: Yggdroot/indentLine

我相应的配置:

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

效果:

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

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

效果如下图:

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

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

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

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

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

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

" Plugin syntastic settings.set statusline+=%#warningmsg#set statusline+=%{SyntasticStatuslineFlag()}set statusline+=%*let g:syntastic_always_populate_loc_list = 1let g:syntastic_auto_loc_list = 1let g:syntastic_check_on_open = 0let g:syntastic_check_on_wq = 0let 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',






请到「今天看啥」查看全文


推荐文章
Python爱好者社区  ·  模仿一下领导说话的样子
15 小时前
Python爱好者社区  ·  今年程序员这薪资是认真的吗?
昨天
python自留地  ·  Python语法基本单词
昨天
拳皇98终极之战OL  ·  【最新活动】开工送福利 惊喜双魂匣!
7 年前
EETOP  ·  跨时钟域设计的一点总结
7 年前
笔吧评测室  ·  32核完美归来!AMD EPYC服务器正式发布
7 年前