环境说明
系统版本:centos7、Ubuntu16
vim版本:7.4 安装git工具 整体说明:本文的vim配置是针对Linux的单个系统用户,python的自动补全使用的是 jedi-vim 插件 适用:Linux系统(centos,Redhat,Ubuntu等等)自定义IDE
关于自定义IDE,每个人的需求不同,这里配置shell和python的环境,python为主。这里将自定义拆分为四部分,.vimrc为基础文件,调用其他三个文件的配置,.vimrc.bundles文件为自定义功能部分;vim_header为自定义文件头,该文件还可以自动更新文件的最新修改时间;run_file为在vim编辑器下直接运行文件,不用退出再运行。
自定义基础文件
.vimrc主要是加载其他三个文件的配置和自动更新文件种类修改时间的判断
点击查看.vimrc文件详细内容```shell" ~/.vimrc 用户vim配置" 关于更新时间说明:退出时按 'wq' 自动更新时间,不论是否有修改;按 'x' 则文件有修改时更新, 按 'q' 更新时间无变化" modify the last modified time of a filefunction SetLastModifiedTime(lineno) let modif_time = strftime("%Y-%m-%d %H:%M:%S") if a:lineno == "-1" let line = getline(10) else let line = getline(a:lineno) endif if line =~ '\sLast Modified:' let line = strpart(line, 0, stridx(line, ":")) . ": " . modif_time endif if a:lineno == "-1" call setline(10, line) else call append(a:lineno, line) endifendfunc" 修改shell脚本的更新时间function SetLastModifiedTime_sh(lineno_sh) let modif_time_sh = strftime("%Y-%m-%d %H:%M:%S") if a:lineno_sh == "-2" let line_sh = getline(9) else let line_sh = getline(a:lineno_sh) endif if line_sh =~ '\sLast Changed:' let line_sh = strpart(line_sh, 0, stridx(line_sh, ":")) . ": " . modif_time_sh endif if a:lineno_sh == "-2" call setline(9, line_sh) else call append(a:lineno_sh, line_sh) endifendfunc" map the SetLastModifiedTime command automatically autocmd BufWrite *.py call SetLastModifiedTime(-1)autocmd BufWrite *.sh call SetLastModifiedTime_sh(-2)" 加载文件头模板run vim_header_model/vim_header" 加载自己定义的语言编辑器配置,包括python,shellif filereadable(expand("~/.vimrc.bundles")) source ~/.vimrc.bundles endifif filereadable(expand("~/.vimrc.run_file")) source ~/.vimrc.run_fileendif```
自定义文件头部信息
自定义文件头部内容,加了一个自动修改文件的最后更新时间
点击查看vim_header文件详细内容```shell" 用户vim配置调用模板,路径:~/.vim/vim_header_model/vim_header ,这里自定义了shell和python的文件头信息autocmd BufNewFile *.cc,*.sh,*.java,*.cpp,*.h,*.hpp,*.py,*.lua exec ":call SetTitle()""定义函数SetTitle,自动插入文件头func SetTitle() let filetype_name = strpart(expand("%"), stridx(expand("%"), ".")) let file_name = strpart(expand("%"), 0, stridx(expand("%"), ".")) if file_name =~ "\/" let file_name = strpart(file_name, strridx(file_name, "/") + 1) endif let time_value = strftime("%Y-%m-%d %H:%M:%S") if filetype_name == ".sh" call setline(1, "\#!/bin/bash") call append(line("."), "") call append(line(".")+1, "\#########################################################################") call append(line(".")+2, "\# File Name: ". file_name . filetype_name) call append(line(".")+3, "\# file_path: ") call append(line(".")+4, "\# Author: 浪子尘心") call append(line(".")+5, "\# Mail: 536418286@qq.com") call append(line(".")+6, "\# Created Time: ".time_value) call append(line(".")+7, "\# Last Changed: ".time_value) call append(line(".")+8, "\# Description: ") call append(line(".")+9, "\# Version: ") call append(line(".")+10, "\#########################################################################") call append(line(".")+11, "") call append(line(".")+12, "") else if filetype_name == ".py" call setline(1, "\#!/usr/bin/env python") call setline(2, "\# -*- coding: utf-8 -*-") call append(line(".")+1, "") call append(line(".")+2, "\#########################################################################") call append(line(".")+3, "\# File Name: ". file_name . filetype_name) call append(line(".")+4, "\# file_path: ") call append(line(".")+5, "\# Author: 浪子尘心") call append(line(".")+6, "\# Mail: 536418286@qq.com") call append(line(".")+7, "\# Created Time: ".time_value) call append(line(".")+8, "\# Last Modified: ".time_value) call append(line(".")+9, "\# Description: ") call append(line(".")+10, "\# Version: ") call append(line(".")+11, "\#########################################################################") call append(line(".")+12, "") call append(line(".")+13, "") endif endifendfunc```
自定义编辑器
这里给出我自己的模板,各位可以根据模板自行修改,文末给出部分效果图,更多使用自行发现。
插件管理使用的是plug,对比其他管理插件之后,个人感觉该管理插件功能最强大 点击查看.vimrc.bundles文件详细内容```shellcall plug#begin('~/.vim/plugged')"添加nerdtree插件,目录树插件Plug 'scrooloose/nerdtree'" NerdTree文件类型高亮Plug 'tiagofumo/vim-nerdtree-syntax-highlight'" 显示文件类型图标Plug 'ryanoasis/vim-devicons'" 更换主题,这个插件拥有更多主题可选,而且远程和本机操作均有效Plug 'chxuan/change-colorscheme'" 添加代码补全插件,YouCompleteMe 插件比 Jedi-vim 功能更丰富,但是由于YCM太笨重,安装可以考虑jedi-vimPlug 'davidhalter/jedi-vim'Plug 'ervandew/supertab'"代码折叠插件Plug 'tmhedberg/SimpylFold'" 比ctrlp更强大的文件的模糊搜索工具,要求vim版本大于7.4.330+"Plug 'Yggdroot/LeaderF'"在vim的normal模式下的文本搜索工具,normal模式就是ESC按键之后的模式,这个插件比ctrlp更强大的文件的模糊搜索工具Plug 'mileszs/ack.vim'"比Powerline更好的状态栏显示插件,可以显示当前的虚拟环境、Git分支、正在编辑的文件等信息Plug 'vim-airline/vim-airline'" 状态栏主题颜色插件,背景插件Plug 'itchyny/lightline.vim'Plug 'joshdick/onedark.vim'" 文件图标下载Plug 'ryanoasis/vim-devicons'" vim-airline 主题插件Plug 'vim-airline/vim-airline-themes'" Git集成,可以在Vim中执行基本的Git命令Plug 'tpope/vim-fugitive'" 为nerdtree添加git支持Plug 'Xuyuanp/nerdtree-git-plugin'" Markdown语法高亮插件Plug 'godlygeek/tabular'Plug 'plasticboy/vim-markdown'" 显示缩进对齐线插件Plug 'Yggdroot/indentLine'" 代码片段补全Plug 'honza/vim-snippets'" 让翻页更顺畅Plug 'terryma/vim-smooth-scroll'" 自动化格式代码工具Plug 'Chiel92/vim-autoformat'call plug#end()" **************通用设置**************set nocompatible " 设置不兼容原始vi模式filetype on " 设置开启文件类型侦测filetype plugin on " 设置加载对应文件类型的插件set noeb " 关闭错误的提示syntax enable " 开启语法高亮功能syntax on " 自动语法高亮set t_Co=256 " 开启256色支持set cmdheight=2 " 设置命令行的高度set showcmd " select模式下显示选中的行数set ruler " 总是显示光标位置set laststatus=2 " 总是显示状态栏set number " 开启行号显示set cursorline " 高亮显示当前行set whichwrap+=,h,l " 设置光标键跨行set ttimeoutlen=0 " 设置键响应时间set virtualedit=block,onemore " 允许光标出现在最后一个字符的后面"set paste " 关闭自动注释"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 代码缩进和排版"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set autoindent " 设置自动缩进set cindent " 设置使用C/C++语言的自动缩进方式set cinoptions=g0,:0,N-s,(0 " 设置C/C++语言的具体缩进方式set smartindent " 智能的选择对其方式filetype indent on " 自适应不同语言的智能缩进set expandtab " 将制表符扩展为空格set tabstop=4 " 设置编辑时制表符占用空格数set shiftwidth=4 " 设置格式化时制表符占用空格数set softtabstop=4 " 设置4个空格为制表符set smarttab " 在行和段开始处使用制表符set nowrap " 禁止折行set backspace=2 " 使用回车键正常处理indent,eol,start等set sidescroll=10 " 设置向右滚动字符数set nofoldenable " 禁用折叠代码"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 代码补全"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set wildmenu " vim自身命名行模式智能补全" 补全时不显示窗口,只显示补全列表,默认补全时显示补全的功能" set completeopt-=preview"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 搜索设置"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set hlsearch " 高亮显示搜索结果set incsearch " 开启实时搜索功能set ignorecase " 搜索时大小写不敏感"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 缓存设置"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set nobackup " 设置不备份set noswapfile " 禁止生成临时文件set autoread " 文件在vim之外修改过,自动重新读入set autowrite " 设置自动保存set confirm " 在处理未保存或只读文件的时候,弹出确认"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 编码设置"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""set langmenu=zh_CN.UTF-8set helplang=cnset termencoding=utf-8set encoding=utf8set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030"高亮显示行伟不必要的空白字符highlight Whitespace ctermbg=red guibg=redau BufRead,BufNewFile *.py,*.pyw,*.c,*.h,*.sh match Whitespace /\s\+$\ \+/" 打开文件自动定位到最后编辑的位置autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | execute "normal! g'\"" | endif" shell 风格au BufNewFile,BufRead *.sh set tabstop=4 "tab 长度设置为 4au BufNewFile,BufRead *.sh set nobackup "覆盖文件时不备份"********************插件配置设置****************" 主题set background=darklet g:onedark_termcolors=256colorscheme onedark" airlinelet g:airline_theme="onedark"let g:airline_powerline_fonts = 1let g:airline#extensions#tabline#enabled = 1if !exists('g:airline_symbols') let g:airline_symbols = {}endiflet g:airline_left_sep = ''let g:airline_left_alt_sep = ''let g:airline_right_sep = ''let g:airline_right_alt_sep = ''" nerdtree-git-pluglet g:NERDTreeIndicatorMapCustom = { \ "Modified" : "✹", \ "Staged" : "✚", \ "Untracked" : "✭", \ "Renamed" : "➜", \ "Unmerged" : "═", \ "Deleted" : "✖", \ "Dirty" : "✗", \ "Clean" : "✔︎︎", \ 'Ignored' : '☒', \ "Unknown" : "?" \ }" LeaderF,Ctrl+f 搜索文件nnoremap :LeaderfFile ~let g:Lf_WildIgnore = { \ 'dir': ['.svn','.git','.hg','.vscode','.wine','.deepinwine','.oh-my-zsh'], \ 'file': ['*.sw?','~$*','*.bak','*.exe','*.o','*.so','*.py[co]'] \}let g:Lf_UseCache = 0" vim-smooth-scrollnoremap :call smooth_scroll#up(&scroll, 0, 2) noremap :call smooth_scroll#down(&scroll, 0, 2)noremap :call smooth_scroll#up(&scroll*2, 0, 4)noremap :call smooth_scroll#down(&scroll*2, 0, 4)" jedi-vim 配置,第一行是启用tab键补全,第二行是禁用 . 补全" let g:SuperTabDefaultCompletionType = "context"" let g:jedi#popup_on_dot = 0"设置分割窗口set splitbelowset splitright"设置窗口切换快捷键,例如,打开目录树的情况下,需要两个窗口来回切换nnoremap nnoremap nnoremap nnoremap " NERDTree 插件设置"设置按F2启动/关闭NerdTree,开关树形目录的快捷键map :NERDTreeToggle" 在 vim 启动的时候默认开启 NERDTree" autocmd vimenter * NERDTree" 将 NERDTree 的窗口设置在 vim 窗口的右侧(默认为左侧)" let NERDTreeWinPos="right"" 当打开 NERDTree 窗口时,自动显示 Bookmarkslet NERDTreeShowBookmarks=1" 显示行号let NERDTreeShowLineNumbers=1let NERDTreeAutoCenter=1" 是否显示隐藏文件let NERDTreeShowHidden=1"隐藏目录树种的.pyc文件let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree" 高亮显示目录树文件let g:NERDTreeFileExtensionHighlightFullName = 1let g:NERDTreeExactMatchHighlightFullName = 1let g:NERDTreePatternMatchHighlightFullName = 1let g:NERDTreeHighlightFolders = 1" 更换目录的显示图标let g:NERDTreeDirArrowExpandable='▷'let g:NERDTreeDirArrowCollapsible='▼'" 自动设置python文件为pep8风格au BufWrite *.py :Autoformat" 更换主题快捷键nnoremap :PreviousColorSchemeinoremap :PreviousColorSchemennoremap :NextColorSchemeinoremap :NextColorSchemennoremap :RandomColorSchemeinoremap :RandomColorSchemennoremap :ShowColorSchemeinoremap :ShowColorScheme"开启代码折叠set foldmethod=indentset foldlevel=99"设置快捷键为空格noremap za"显示折叠代码的文档字符串let g:SimpylFold_docstring_preview=1" vim字体设置if has("gui_running") set guifont=Droid\ Sans\ Mono\ Nerd\ Font\ Complete:h18 " 设置字体 set guioptions-=m " 隐藏菜单栏 set guioptions-=T " 隐藏工具栏 set guioptions-=L " 隐藏左侧滚动条 set guioptions-=r " 隐藏右侧滚动条 set guioptions-=b " 隐藏底部滚动条 set showtabline=0 " 隐藏Tab栏 set guicursor=n-v-c:ver5 " 设置光标为竖线endif" 在显示目录树情况下直接退出,不用退出两次才回到命令行autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif" 命令行安装命令" vim -c "PlugInstall" -c "q" -c "q"```
配置好之后,可以在命令行中直接安装,使用方法如下
vim -c "PlugInstall" -c "q" -c "q"
编辑器内部运行文件配置
.vimrc.run_file文件主要是可以让文件在vim编辑器里运行,从而避免每次运行都要退出vim,按F5运行文件
点击查看.vimrc.run_file文件详细内容```shell"一键运行代码map :call CompileRunGcc() func! CompileRunGcc() exec "w"if &filetype == 'c' exec "!g++ % -o % %.html &" exec "!firefox %.html &"endif endfunc```
部分自定义快捷键
详细的相关快捷键在配置文件里面,可以根据个人爱好设置,快捷键的设置在 .vimrc.bundles 文件中,这里列出部分
F2 开启/关闭目录树
F9 下一个主题 F10 上一个主题 Ctrl+H 向左切换窗口 Ctrl+J 向下切换窗口 Ctrl+K 向上切换窗口 Ctrl+L 向右切换窗口一键部署
以上配置是目前的vim自定义配置,由于环境不同,下载安装时间长,在新机器部署时发现效率特别低,所以把原始文件打包放GitHub上,做了个一键部署脚本,前提是Linux下存在git命令,能够克隆文件,一键部署只需要执行以下步骤
# jedi和pe8的支持插件pip install jedi autopep8# centos7下系统默认没有pip,需要安装epel源和pipyum install epel-release -yyum install python2-pip -y# 自定义部署过程git clone https://github.com/automationroad/vimIDE_config.gitsh vimIDE_config/latest/latest_deploy_vimIDE.sh
一些实用技巧
1、在vim下复制文本内容时,由于vim自动缩进,造成复制的文本内容跟原来的不同格式,这时可以进入vim,然后设置:set paste 暂时取消自动缩进,复制内容时格式保持原样
2、待补充。。。效果图
下图中, Last Changed 字段会根据vim修改文件的时间自动更新,特性和vim更新文件修改时间一样,退出时,按 q 或 q! 不更新时间,qw 一定会更新修改时间,x 当文件有修改时间更新修改时间
shell效果图 python效果图 补全效果图 目录树效果图 在Ubuntu下,目录树还会显示文件图标 目录树打开文件vim使用文档
网上很多关于快捷键的图,本文底部附上一张快捷键图,另外以下两个方法是在Linux系统下学习练习的方法
1、vim快速入门文档,系统自带的简易教程,命令行输入 vimtutor(最简易的实践帮助文档,没有之一),文档是中文的 2、命令行输入 vim ,命令模式下输 :help ,这个是多窗口,输入 :help | only 设置只在一个窗口中显示 这里说明一下,系统自带的vim说明文档是英文的,设置为中文的方法cd ~wget http://sourceforge.net/projects/vimcdoc/files/vimcdoc/1.8.0/vimcdoc-1.8.0.tar.gztar --no-same-owner -zxf vimcdoc-1.8.0.tar.gz[ ! -d ~/.vim ] && mkdir ~/.vimmv vimcdoc-1.8.0 ~/.vim/doccd ~/.vim/doc# 安装中文文档用 i 参数,卸载使用 u 参数./vimcdoc.sh -i# 到这一步已经可以打开vim查看中文帮助文档了,如果还是英文,则需要在配置文件修改,以下列出操作[ ! -f ~/.vimrc ] && touch ~/.vimrcecho 'set helplang=cn' >> ~/.vimrc# vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:# :set helplang=en 回车之后 :help 就是英文的help# 同理,使用以下命令可重新使用中文文档# :set helplang=cn 回车之后 :help 就是中文的help