当前位置: 首页 > 科技观察

终端前言优雅写Python

时间:2023-03-21 13:10:42 科技观察

起初,我只是在服务器上编辑文件时使用vim来修改程序,并没有使用vim作为我的主要编辑器。但一次偶然的机会,我需要更改一个奇怪的输入文件的格式。用过Vim的宏录制,尝到了甜头,所以后来开始用Vim写程序。虽然在使用初期会有一些阻力,但是时间一长就会了。我发现我的手再也不用离开键盘了。即使我用sublime这样的编辑器,我也得切换到Vim模式。Vim真的可以按照我自己思考的速度编辑文本(对我来说,就是写程序)。最近刚换了台新电脑,需要在新电脑上配置。记录一些配置相关的东西。我把所有相关的配置文件都放在了github上(https://github.com/PytLab/dotfiles),并编写了相应的安装和卸载脚本,以供有需要的同学参考。本文是一篇关于配置的文章,不讲解Vim的核心技巧。需要的童鞋可以参考文档和相关书籍。这里主要配合的是tmux和vim,可以帮助我们更优雅的在终端中进行Python编程。先来个粗略的渲染:文本终端窗口管理工具Tmux首先需要配置tmux。除了多窗口和多面板,最重要的是它提供了随时存储和恢复窗口组的功能。它还可以帮助我们在使用vim的同时在ipython中测试时在一个窗口中使用多个面板。tmux的配置文件是当前用户家目录下的.tmux.conf文件。tmux启动时会自动加载,也可以在tmux中加载,如:source~/.tmux.conf。完整的配置文件见:https://github.com/PytLab/dotfiles/blob/master/.tmux.conf修改快捷键前缀tmux的配置比较简单。我先把快捷键前缀从Ctrl-b改成Ctrl-l的选择主要是看个人喜好,因为左手Ctrl-右手l更方便。#settmuxprefixtoset-gprefixC-lunbindC-b修改分屏快捷键tmux的分屏快捷键默认值为:+"水平分屏+%垂直分屏感觉怪怪的,所以我就改成了比较直观的方式:+|,类似于在屏幕上加一条配置线+-,类似于在屏幕上加一条横线#Splitpane.unbind'"'bind|splitw-hunbind'%'bind-splitw-v把拷贝模式改成vim的拷贝模式。由于用惯了vim,不想动鼠标,所以tmux也可以把复制方式改成和Vim一样的方式,只是操作的前缀不同。#Copymode#copy-modetovimodesetw-gmode-keysvi#entercopymodebindEscapecopy-mode#pastebufferbindC-ppasteb#select(v)bind-tvi-copyvbegin-selection#copy(y)bind-tvi-copyycopy-selection这里绑定PanelSwitch快捷键面板切换,我绑定面板的上、下、左、右四个方向与Vim中的光标移动相同的四个kjhl键,与Vim保持一致,这样就不需要记住新的方向键了。#Mappanelswitch.#Upbind-keykselect-pane-U#Downbind-keyjselect-pane-D#leftbind-keyhselect-pane-L#rightbind-keylselect-pane-R修改面板大小的快捷键这里是移动大小更灵活的是,我打开了鼠标控制,这样我就可以用鼠标方便、精确地调整面板大小。#resizepanelsize.bindresize-pane-R10bind_resize-pane-D10bind+resize-pane-U10#Usemousetoresizepanel.set-gmouse-utf8on配置当然要根据自己的使用习惯来设置,这里是只是一个参考。这样一来,我们就可以把多窗口终端的控制玩到手掌上了。Vim配置解决了终端窗口的问题,我们开始在编辑器里大刀阔斧的改动。这里整理一下自己使用的几个Vim插件,并说明几个基本的配置。完整的vim配置文件可以参考:https://github.com/PytLab/dotfiles/blob/master/.vimrc关于Vim的安装这里主要说一下Vim在Mac上的安装。推荐使用Vim官网和YouCompleteMe的README。MacVim,但是如果我们在使用Vim的时候不想开新窗口而是直接在终端中使用Vim,那么在安装完MacVim之后还需要做一些处理。1.安装MacVimbrewcaskinstallmacvim2.使用MacVim的mvim脚本覆盖系统自带的vimaliasvim='/usr/local/bin/mvim-v'aliasvi='vim'自动给打开的文件加上头文件。例如,我们在编写Python脚本时,往往会在文件开头加上可执行文件的Python路径和文件的编码方式。我们可以在Vim配置文件中添加一个函数,让它在打开新缓冲区时自动添加到头部。"Autoaddheadinfo".pyfileintoaddheaderfunctionHeaderPython()callsetline(1,"#!/usr/bin/envpython")callappend(1,"#-*-coding:utf-8-*-")normalGnormaloendfautocmdbufnewfile*.pycallHeaderPython()所以当我们使用vinew.py时,会匹配文件后缀,执行headeradding函数来添加内容。bash、perl等其他语言的脚本类似。安装插件管理器Vundle如果你想安装插件,你必须有一个方便的插件管理器。Vim有很多插件管理器。这里我使用Vundle。它的全称是VimBundle,它可以让我们轻松地安装、更新、搜索和清理Vim插件。Vundle本身是一个Vim插件,所以我们先安装所有需要安装的插件。Vundle的安装方法这里就不详细介绍了,可以参考:https://github.com/VundleVim/Vundle.vim安装完成后,我们需要修改.vimrc文件:setnocompatiblefiletypeoffsetrtp+=~/.vim/bundle/Vundle.vimcallvundle#begin()"在这里添加你要安装的Vim插件callvundle#end()"requiredfiletypepluginindenton"required这样如果我们要安装插件,只需要调用vundle#begin()并调用vundle#end()直接写就可以了,很方便,写完后我们直接运行vim+PluginInstall+qallvundle插件会自动下载安装,我们可以直接当party使用。神器YouCompleteMeYouCompleteMe是一款非常强大的Vim自动补全插件,特别之处在于它不像vim自带的Ctrl-x和Ctrl-n那样基于文本补全,而是基于语义,通过分析源码用于语法分析的文件,这有利于基于强大的lclang/llvm。同时,YCM还集成了多种插件,其中也包括语法纠错,类似于Syntastic,但只针对C/C++/Objective-C语法检测。对于Python,我们后面需要安装Syntastic插件。YCM虽然功能强大,但是安装起来还是有点麻烦。首先,它的文件比较大,需要自己编译(NeoVundle插件管理器貌似可以直接自动帮你编译),但是不管我之前在ubuntu上还是现在mac,至少我没遇到什么大问题。具体安装请参考YCM的安装说明:https://github.com/Valloric/YouCompleteMe#installationYCM相关设置:"PluginYCMsettings.setcompleteopt=longest,menuletg:ycm_min_num_of_chars_for_completion=2letg:ycm_cache_omnifunc=0letg:ycm_seed_identifiers_with_syntax=1comlette:1letg:ycm_complete_in_strings=1letg:ycm_collect_identifiers_from_comments_and_strings=0letg:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'letg:syntastic_check_on_open=1letg:syntastic_enable_signs=1letg:syntastic_cpp_check_header=1letg:syntastic_cpp_remove_include_errors=1YCM除了在.vimrc中进行配置外,还有一个Python的配置文件.ycm_extra_conf.py,在里面我们可以设置相应的编译选项,比如编译参数,头文件和库文件的地址等,这样当我们写C/C++等的时候,ycm会发现相应的头文件和编译库文件,并给出相应的提示,这个文件需要根据你的情况定制自己的项目和你自己的文件位置。完整版我的.ycm_extra_conf.py:https://github.com/PytLab/dotfiles/blob/master/.ycm_extra_conf.py帮助Python缩进写Python的时候一定需要一个插件来帮你显示缩进.indentLine是一个提供缩进线的插件。在判断Python代码块的时候就方便多了。插件地址:https://github.com/Yggdroot/indentLine我的对应配置:"PluginindentLinesettings.letg:indentLine_char="┆"letg:indentLine_enabled=1letg:autopep8_disable_show_diff=1作用:当我们对多个打开的文件进行操作写代码的时候,不可能一次只打开一个文件,而是打开很多,而且经常来回切换,Vim自带缓冲区管理工具,但是不够直观,这时候可以使用minibufexplorer插件-in,这样就可以在Vim中像切换tab一样切换buffer来同时编辑多个文件,效果如下图所示:我们可以使用Ctrl+w:bbuffer-number来快速切换使用Pylint来帮助我们进行Python语法检测,首先,Pylint是一个代码分析工具,可以分析Python中的代码错误,找到不符合风格标准的代码(默认PEP8)和潜在的问题,如果单独使用,他也可以帮助我们。Python代码来检测并生成报告,并对您的代码进行评分,如下所示:pylintincar.py--output-format=html>score.html我们可以使用syntastic插件来使用pylint来帮助我们进行语法检查。syntastic的安装可以直接通过Vundle方便的安装。安装后,我们需要配置如下:"Pluginsyntasticsettings.setstatusline+=%#warningmsg#setstatusline+=%{SyntasticStatuslineFlag()}setstatusline+=%*letg:syntastic_always_populate_loc_list=1letg:syntastic_auto_loc_list=1letg:syntastic_check_on_open=0letg:syntastic_q:syntastic_map=check_letgasticon={'mode':'passive','active_filetypes':[],'passive_filetypes':[]}"Usepylinttocheckpythonfiles.letg:syntastic_python_checkers=['pylint']map:SyntasticToggleMode:SyntasticCheck“忽略关于newlinestrailing.letg: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']}这里主要涉及两部分的配置,一是将检测方式改为passive,因为Syntastic检测不是异步进行的,如果每次保存都检测到,就会卡在那里等一会。如果我的代码是r比较大,需要的时间会更长,所以我们想检测的时候就检测。忽略一些我们不想看到的警告。如果pylint完全按照PEP8,我的代码会经常出现各种提示的warning。比如我喜欢在最后一行代码留一个空行,会有提示,所以我用正则表达式过滤掉次要消息,这时就需要设置syntastic_quiet_message变量。树目录方便文件查看。和其他IDE一样,如果左边有个树形目录,所有文件夹和文件一目了然,那肯定是极好的,所以NERDTree插件就是这样一个工具,可以直接通过Vundle安装,并且然后在配置文件中设置启动快捷键、窗口大小、忽略显示的文件等。"Pluginnerdtreesettings.map:NERDTreeToggleletNERDTreeChDirMode=1letNERDTreeShowBookmarks=1letNERDTreeWinSize=25letNERDTreeShowHidden=1letNERDTreeIgnore=['\~$','\.pyc$','\.swp$','\.git$']快速定位工程中的文件ctrlp.vim顾名思义,它提供了和Sublime的Ctrl+p一样的功能,可以直接通过Vundle安装,将其映射到配置文件中的一个功能键即可快速启动查找和查找支持模糊匹配map:CtrlP显示文件中的类、函数、变量,tagbar插件可以帮我们显示当前文件中的类、函数、变量,方便我们来阅读代码,它是基于ctags的,支持多种语言,具体可以看:https://github.com/majutsushi/tagbar/wiki安装好ctags后,可以直接从Vundle安装,在配置文件中,可以绑定一个快捷键快速启动map:TagbarToggle效果如下:o其他插件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等工具的配置,希望能帮助大家更好的在终端编程,提高工作效率。最后建议不要盲目在配置文件里复制粘贴别人的配置,它最好保证里面的配置是自己的他们都知道怎么做以及他们需要什么。