当前位置: 首页 > 编程日记 > 正文

使用vim打造自己的python编辑器

基础配置

vim的配置是在用户主目录下的 ~/.vimrc 文件中完成的,如果没有的话,需要自己新建一下:

cd ~
touch .vimrc

首先做些简单的配置:

set nocompatible "关闭与vi的兼容模式
set number "显示行号
set nowrap    "不自动折行
set showmatch    "显示匹配的括号
set scrolloff=3        "距离顶部和底部3行"
set encoding=utf-8  "编码
set fenc=utf-8      "编码
set mouse=a        "启用鼠标
set hlsearch        "搜索高亮
syntax on    "语法高亮

为py文件添加下支持pep8风格的配置:

au BufNewFile,BufRead *.py
\ set tabstop=4   "tab宽度
\ set softtabstop=4  
\ set shiftwidth=4   
\ set textwidth=79  "行最大宽度
\ set expandtab       "tab替换为空格键
\ set autoindent      "自动缩进
\ set fileformat=unix   "保存文件格式

分割窗口

vim在编辑的时候就可以打开多个文件:

:vs  或者 :vsplit  将当前窗口竖直分割,并在上面新窗口中显示当前文件

:vs filename 将当前窗口竖直分割,新文件在新窗口中显示

:sp 或者:sv或者:split  将当前窗口水平分割,并在左边新窗口中显示当前文件

:sp filename 将当前窗口竖直分割,新文件在左边新窗口中显示

:new 新建文件并竖直分割

:vnew 新建文件并水平分割

如果想让新窗口在右边或者下方打开,添加配置:

set splitbelow
set splitright

在窗口之间切换可以用鼠标,如果不想用鼠标,切换按键如下:

  • Ctrl-w-j 切换到下方的分割窗口
  • Ctrl-w-k 切换到上方的分割窗口
  • Ctrl-w-l 切换到右侧的分割窗口
  • Ctrl-w-h 切换到左侧的分割窗口

觉得三个按键多的话可以设置快捷键:

nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>

这样就不用按w键了。

代码折叠

当代码行数很多的时候,代码折叠是很必须的:

set foldmethod=indent
set foldlevel=99

使用zc按键来创建折叠,使用za来打开或者关闭折叠。

za经常会误输入,可以用空格键来替代za:

nnoremap <space> za

一键执行python代码

如果想直接在vim中执行python代码,可以添加(来自https://www.zhihu.com/question/20271508):

map <F5> :call RunPython()<CR>
func! RunPython()exec "W"if &filetype == 'python'exec "!time python2.7 %"endif
endfunc

这样,按F5键python代码就可以自动执行了

插件

vim插件中最主要的就是vundle了,vundle用来管理vim的其它插件

Vundle

Vundle 是 Vim bundle 的简称,使用git来管理vim插件,有了它,安装其它插件就方便很多。

项目地址https://github.com/VundleVim/Vundle.vim。

首先下载源码:

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

如果~/.vim/bundle目录不存在,则新建目录:

cd ~
mkdir .vim
cd .vim
mkdir bundle

然后将下列配置放在.vimrc文件的开头:

set nocompatible              " be iMproved, required
filetype off                  " required" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

如果想下载某个插件,比如自动缩进indentpython.vim插件,需要将

Plugin 'vim-scripts/indentpython.vim'

置于call vundle#begin()和call vundle#end()之间,保存配置后在vim中执行

:PluginInstall

即可以自动下载indentpython.vim插件了。

bundle可以管理下载几种不同的插件,方式如下:

github上的插件
Plugin 'tpope/vim-fugitive'
来自于http://vim-scripts.org/vim/scripts.html的插件
Plugin 'L9'
非github上的git插件
Plugin 'git://git.wincent.com/command-t.git'
本地插件
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
" Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
有旧插件的情况下,下载新的插件并重命名以避免冲突
Plugin 'ascenator/L9', {'name': 'newL9'}

下载方式除了在vim中运行:PluginInstall外,还可以在命令行中运行:

vim +PluginInstall +qall

其它常用的命令:

:PluginList       - lists configured plugins
:PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
:PluginSearch foo - searches for foo; append `!` to refresh local cache
:PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal

YouCompleteMe

非常好用的自动补全插件,就是比较重。

官网地址:http://valloric.github.io/YouCompleteMe/

github地址:https://github.com/Valloric/YouCompleteMe

YouCompleteMe安装后还需要手动编译,然后再在.vimrc中配置。

在ubuntu中使用,首先准备一些工具:

sudo apt-get install build-essential cmake
sudo apt-get install python-dev python3-dev

使用vundle安装:

Plugin 'Valloric/YouCompleteMe'

编译:

cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer

参数 --clang-completer是为了加上C系列语言的自动补全,也可以不加:

cd ~/.vim/bundle/YouCompleteMe
./install.py

耐心等待吧,要花很长时间...

复制一下默认配置文件到用户主目录:

cp third_party/ycmd/examples/.ycm_extra_conf.py ~/

YCM常用的一些选项,可根据个人喜好调整:

let g:ycm_min_num_of_chars_for_completion = 2  "开始补全的字符数"
let g:ycm_python_binary_path = 'python'  "jedi模块所在python解释器路径"
let g:ycm_seed_identifiers_with_syntax = 1  "开启使用语言的一些关键字查询"
let g:ycm_autoclose_preview_window_after_completion=1 "补全后自动关闭预览窗口"

代码跳转:

nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

开关YCM:

let g:ycm_auto_trigger = 0   "turn off
let g:ycm_auto_trigger = 1   "turn on

支持vim8的补全插件

YouCompleteMe实际上是使用jedi-vim来补全python代码的,如果觉得YCM实在太重,可以使用支持vim8的maralla/completor.vim来补全代码:

下载:

Plugin 'maralla/completor.vim'

下载jedi:

pip install jedi

配置:

let g:completor_python_binary = '/path/to/python/with/jedi/installed'

设置起来比YCM简单很多了。

自动缩进插件

写python代码,自动缩进是必须的,可以使用indentpython.vim插件:

Plugin 'vim-scripts/indentpython.vim'

语法检查

安装syntastic插件,每次保存文件时Vim都会检查代码的语法:

Plugin 'vim-syntastic/syntastic'

添加flake8代码风格检查:

Plugin 'nvie/vim-flake8'

运行F7就可以进行flake8检查了。

配色方案

solarized配色方案已经流行很久了,github地址https://github.com/altercation/vim-colors-solarized。

手动下载:

$ cd ~/.vim/bundle
$ git clone git://github.com/altercation/vim-colors-solarized.git
$ mv vim-colors-solarized ~/.vim/bundle/

或者vundle下载:

Plugin 'altercation/vim-colors-solarized'

solarized有dark和light两种配色,配置:

syntax enable
set background=light or dark
colorscheme solarized

也可以根据gui模式和终端模式进行切换:

if has('gui_running')set background=light
elseset background=dark
endif

另外一种配色Zenburn方案:

Plugin 'jnurmine/Zenburn'

两种配色切换:

if has('gui_running')set background=darkcolorscheme solarized
elsecolorscheme Zenburn
endif

nerdtree

给vim添加一个树形目录,地址https://github.com/scrooloose/nerdtree。

下载:

Plugin 'scrooloose/nerdtree'

添加开关树形目录的快捷键:

map <C-n> :NERDTreeToggle<CR>

Ctrl+n就可以开启目录了。

设置忽略.pyc文件:

let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']

为nerdtree添加git支持:

Plugin 'Xuyuanp/nerdtree-git-plugin'

如果你想用tab键:

Plugin 'jistr/vim-nerdtree-tabs'

vim-powerline

美化状态栏,可以显示当前的虚拟环境、Git分支、正在编辑的文件等信息。

Plugin 'Lokaltog/vim-powerline'

indentLine

缩进指示线,地址https://github.com/Yggdroot/indentLine。

安装:

Plugin 'Yggdroot/indentLine'

python是靠代码缩进来判断代码块的,缩进指示线还是很方便的。

vim-autopep8

自动格式化工具,安装后运行:Autopep8就可以自动依照pep8的标准自动格式化代码。

地址https://github.com/Yggdroot/indentLine。

首先安装autopep8:

$ pip install autopep8
Plugin 'tell-k/vim-autopep8'

可以设置快捷键F8代替:Autopep8:

autocmd FileType python noremap <buffer> <F8> :call Autopep8()<CR>

auto-pairs

自动补全括号和引号等,地址https://github.com/jiangmiao/auto-pairs。

Plugin 'jiangmiao/auto-pairs'

ctrlp.vim

搜索插件,在vim normal模式下,按下ctrl+p,然后输入你要寻找的文件就行了。

地址https://github.com/kien/ctrlp.vim。

Plugin 'kien/ctrlp.vim'

ag.vim

搜索引擎使用了the_silver_searcher

apt-get install silversearcher-ag
or
brew install the_silver_searcher

插件

Plugin 'rking/ag.vim'

使用

:Ag [options] {pattern} [{directory}]

vim-fugitive

git集成插件,可以在vim中运行git命令,https://github.com/tpope/vim-fugitive。

Plugin 'tpope/vim-fugitive'

相关文章:

两亿多用户,六大业务场景,知乎AI用户模型服务性能如何优化?

作者 | 王政英来源 | 知乎技术专栏用户模型简介知乎 AI 用户模型服务于知乎两亿多用户&#xff0c;主要为首页、推荐、广告、知识服务、想法、关注页等业务场景提供数据和服务&#xff0c;例如首页个性化 Feed 的召回和排序、相关回答等用到的用户长期兴趣特征&#xff0c;问题…

加班到凌晨三点,就能月薪五万了吗?

早起上班的地铁上&#xff0c;看到朋友圈有不少人刷视觉志推出的一篇《凌晨3点不回家&#xff1a;成年人的世界是你想不到的心酸》&#xff0c;出于好奇&#xff0c;就点击看了一些。文章用一堆煽情的图片和煽情的文字推导出一个结论&#xff1a;成年人的世界很不容易&#xff…

山西之行的感想

出差学习、外出培训&#xff08;既“训”别人&#xff0c;也被别人“训”&#xff0c;呵呵&#xff09;……充实啊。关于这次出差学习&#xff0c;很想说点什么的。不过说实话&#xff0c;他们的全员人口系统目前只是完成信息编辑、查询功能&#xff0c;进一步的汇总、数据挖掘…

GIS开发随笔(2)——关于建立GIS数据库的几个问题

真正的实战开始了&#xff0c;根据用户的需求首先就是编写了一大堆的这样那样的文档说明&#xff0c;并根据用户需求分析建立了数据库的库表及其内容。在建库的过程中我们使用的是微软的Sql Server2000数据库&#xff0c;在分析数据库前也在网上游荡了些时日&#xff0c;发现很…

刘铁岩谈机器学习:随波逐流的太多,我们需要反思

嘉宾 | 刘铁岩 整理 | 阿司匹林 来源 | AI科技大本营在线公开课 人工智能正受到越来越多的关注&#xff0c;而这波人工智能浪潮背后的最大推手就是“机器学习”。机器学习从业者在当下需要掌握哪些前沿技术&#xff1f;展望未来&#xff0c;又会有哪些技术趋势值得期待&#…

SQL2K数据库开发二之查看和修改Sample数据库

1.在SQL Server 企业管理器中&#xff0c;选择“数据库”节点&#xff0c;右击sample 数据库图标&#xff0c;在弹出的菜单中选择“属性”。 2."常规"页面显示了数据库的概要信息。 3.“文件组”页面显示了数据库中现有的文件组&#xff0c;此时数据库中只有一个主文…

谈点正经的:Papi酱能火,如果你现在学她却未必能火起来

集才华美貌于一身的女子Papi酱刷屏了。先是融资1200万&#xff0c;估值3亿。其次&#xff0c;又即将在四月和罗辑思维一起联手推出“中国第一场新媒体广告拍卖会”。 这些数据和事件串在一起&#xff0c;网红经济又被推至新的高点&#xff0c;内容在资本圈也越发繁荣。是的&…

全国各地DNS地址

全国各地电信DNS服务器地址北京&#xff1a;202.96.199.133 202.96.0.133 202.106.0.20 202.106.148.1 202.97.16.195上海&#xff1a;202.96.199.132 202.96.199.133 202.96.209.5 202.96.209.133天津&#xff1a;202.99.96.68 10.10.64.68广东&#xff1a;202.96.128.143 202…

iteye和微博

如果iteye能同步新浪微博&#xff0c;我以后就用iteye来写技术博客

BIND日志相关(二)

在Linux环境下&#xff0c;提供了广泛流行的BIND服务器&#xff0c;它是构建DNS服务器最常用的服务器软件。介绍BIND的安装的文章现在很多&#xff0c;现在我们就一起来谈一下维护的话题。我们如何才能够了解DNS服务器的运行情况下呢&#xff0c;它忙不忙、负载大不大?这一切&…

riot.js教程【四】Mixins、HTML内嵌表达式

前文回顾riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期&#xff1b;riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法&#xff1b;riot.js教程【一】简介&#xff1b; 共享Mixins 混合开发可以使你很好的复用代码&#xff0c;如…

思必驰发布AI芯片,透视智能语音企业的商业化历程

2019 年 1 月 4 日&#xff0c;言由芯生——2019 年思必驰 AI 芯片暨战略发布会在京举行。 现场&#xff0c;AI 芯片作为重头戏展示了其低功耗、高性能的核心优势&#xff0c;同时&#xff0c;思必驰多视角解读了 2018 年所取成果&#xff0c;并公布了 2019 年战略路线&#x…

【转载from冰河】来杭十周年

2001年9月12日&#xff0c;我高中毕业考入浙江大学&#xff0c;开始了杭州的生活&#xff1b;今天算是来杭十周年纪念日。中午我在杭州四眼井国际青年旅舍准备了一只烤全羊&#xff0c;邀请浙大毽球协会成员和包括 Mazha、andyfires 和萝卜等当年在校期间一起搞计算机的朋友们一…

CNI:容器网络接口

CNI&#xff1a;容器网络接口CNI简介不管是 docker 还是 kubernetes&#xff0c;在网络方面目前都没有一个完美的、终极的、普适性的解决方案&#xff0c;不同的用户和企业因为各种原因会使用不同的网络方案。目前存在网络方案 flannel、calico、openvswitch、weave、ipvlan等&…

马云:你改变不了特朗普,你连你妈都改变不了,你要改变你自己

整理 | 非主流出品 | AI 科技大本营1 月 3 日&#xff0c;世界浙商上海论坛暨上海市浙江商会第十次会员代表大会在上海举行。马云在大会上发表主题演讲&#xff0c;依旧金句频出。回望 2018&#xff0c;马云表示&#xff0c;「2018 年确实很不容易&#xff0c;但是大家都度过了…

简述Field,Attribute,Property的区别

您要是关注我这个&#xff0c;说明您是行内人&#xff0c;那我就开门见山了&#xff0c;用代码来诠释吧 //Fieldprotectedstring_Version;//Attribute[XmlElement("Version")]//PropertypublicstringVersion{ set{ _Version value; } get{ return_Version; }}转载…

添加Soap头来增加Web Service的安全性

myService.asmx.cs 添加类&#xff1a;MyHeader 从 System.Web.Services.Protocols.SoapHeader继承 完整的代码如下usingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Diagnostics;usingSystem.Web;usingSystem.Web.Services;//对…

BAT七年经验,却抵不过外企面试的两道算法题?

整理| 琥珀 出品| AI科技大本营又遇年底跳槽季&#xff0c;如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验&#xff0c;想要换份工作&#xff0c;面试时会主要考虑哪些因素&#xff1f;面试外企&#xff0c;却被两道算法题难住&#xff1f;近日&#xff0c;一位网友在脉脉…

#Ruby# Introspect (1)

Introspect&#xff0c;内省&#xff0c;是指从程序自身出发&#xff0c;审视程序各方面的能力。这个过程又称为Reflection&#xff0c;反射。 孔子曰&#xff0c;吾日三省吾身。于人于程序&#xff0c;内省都是非常重要的。 1. Looking at objects ObjectSpace.each_object([…

java.lang.IllegalMonitorStateException 异常出现原因

java.lang.IllegalMonitorStateException 违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象&#xff08;O&#xff09;的监控器或者通知其他线程等待该对象&#xff08;O&#xff09;的监控器时&#xff0c;抛出该异常。 例子&#xff1a; //计算线程 //获取计算…

Tomcat init 脚本并添加服务自启动

很多用源码编译安装和一些用tar包直接解压缩的java程序都没有init脚本&#xff0c;不能像httpd或者nginx这种服务直接使用service httpd start&#xff0c;也不能使用/etc/init.d/httpd start 来启动。对于这种情况&#xff0c;我们可以自己写一个init脚本&#xff0c;并将命令…

算法 | 动画+解析,轻松理解「Trie树」

Trie这个名字取自“retrieval”&#xff0c;检索&#xff0c;因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词。 虽然发音与「Tree」一致&#xff0c;但为了将这种 字典树 与 普通二叉树 以示区别&#xff0c;程序员小吴一般读「Trie」尾部会重读一声&#xff0c;可…

#Ruby# Introspect (2)

3. Looking at Classes superclass > get the parent of any particular class ancestors > get both superclasses and mixin modules 在Ruby1.9中&#xff0c;任何未指定的class都继承自Object&#xff0c;而Object继承自BasicObject&#xff0c;BasicObject无supercla…

国内ITSM解决方案-UNIPER

UNIPER是行业领先的ITSM解决方案提供商。参与了ITIL V3的开发与实践&#xff0c;是中国ITSM行业推动者之一&#xff0c;方案包括服务台&#xff0c;事件和问题管理&#xff0c;变更和配置管理&#xff0c;服务等级管理&#xff0c;IT运营绩效考评&#xff0c;主动计划任务管理&…

清华首批7门标杆课程,到底有多牛?

整理 | Jane出品 | AI科技大本营近日&#xff0c;清华大学公布首批七门标杆课程。什么是标杆课程&#xff1f;据清华大学官方介绍&#xff0c;此项评选是 2018 年 4 月启动的&#xff0c;由各院系推荐、教务处形式审查。本次最终确定了 26 门课程参加评审&#xff0c;并于 2018…

我的Rails笔记(1)

《Agile Web Development With Rails》Notebook. 环境&#xff1a; Rails 3.1.0 Gem 1.8.10 Ruby ruby 1.9.2p180 1. rails depot 2. rails generate scaffold Product title:string description:text image_url:string price:decimal 报错&#xff1a;/1.9.1/gems/execj…

资源 | 斯坦福最新NLP课程上线,选择PyTorch放弃TensorFlow

整理 | Jane 出品 | AI科技大本营 今天在斯坦福大学 2019 年冬季 CS224n 最新课程已经正式更新到官网啦。新一年&#xff0c;大家可以开始跟着名校课程学起来啦~今年一个非常大的变化就是所有内容实现都使用 PyTorch&#xff0c;不再使用 TensorFlow。内容设计方面新增了 Tra…

推荐本人微博及浅谈发博原则

本人新浪微博&#xff1a;http://weibo.com/jinbinforever 花了一些力气&#xff0c;将关注数降到100以下&#xff0c;以后原则上关注数不会增加了。发现这样做的好处非常明显&#xff0c;减少了很多无谓的信息干扰。less is more&#xff0c;做减法能让自己收获更多&#xff0…

Lintcode108 Palindrome Partitioning || solution 题解

【题目描述】Given a strings, cutsinto some substrings such that every substring is a palindrome.Return the minimum cuts needed for a palindrome partitioning ofs.给定一个字符串s&#xff0c;将s分割成一些子串&#xff0c;使每个子串都是回文。返回s符合要求的的最…

发现价值(1)-无限的网络资源

Google发布Google wave的新闻甚嚣尘上.匆匆忙忙间,我也第一时间浏览了这个未来的杀手级应用.不得不赞叹Google强大创新力的同时,又不得不在自己的 to-read-list 上多了一个标签. 仅仅是read是不能产生任何价值的,对于技术我们需要dive into it.这点我明白,但是还是常常陷入浩如…