打造个人的vimIDE

环境说明

系统版本: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 file
function 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)
endif

endfunc
" 修改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)
endif

endfunc

" 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,shell
if filereadable(expand("~/.vimrc.bundles"))
source ~/.vimrc.bundles
endif
if filereadable(expand("~/.vimrc.run_file"))
source ~/.vimrc.run_file
endif

</code></pre>
</details>


## 自定义文件头部信息
自定义文件头部内容,加了一个自动修改文件的最后更新时间

<details>
<summary>点击查看vim_header文件详细内容</summary>
<pre><code>
```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
    endif
endfunc

自定义编辑器

这里给出我自己的模板,各位可以根据模板自行修改,文末给出部分效果图,更多使用自行发现。
插件管理使用的是plug,对比其他管理插件之后,个人感觉该管理插件功能最强大

点击查看.vimrc.bundles文件详细内容

```shell
call 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-vim
Plug '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-8
set helplang=cn
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

"高亮显示行伟不必要的空白字符
highlight Whitespace ctermbg=red guibg=red
au 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 长度设置为 4
au BufNewFile,BufRead *.sh set nobackup "覆盖文件时不备份

"********************插件配置设置****************
" 主题
set background=dark
let g:onedark_termcolors=256
colorscheme onedark

" airline
let g:airline_theme="onedark"
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_left_sep = '�'
let g:airline_left_alt_sep = '�'
let g:airline_right_sep = '�'
let g:airline_right_alt_sep = '�'

" nerdtree-git-plug
let 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-scroll
noremap :call smooth_scroll#up(&scroll, 0, 2)
noremap :call smooth_scroll#down(&scroll, 0, 2)
noremap :call smooth_scroll#up(&scroll2, 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 splitbelow
set splitright
"设置窗口切换快捷键,例如,打开目录树的情况下,需要两个窗口来回切换
nnoremap
nnoremap
nnoremap
nnoremap

" NERDTree 插件设置
"设置按F2启动/关闭NerdTree,开关树形目录的快捷键
map :NERDTreeToggle
" 在 vim 启动的时候默认开启 NERDTree
" autocmd vimenter * NERDTree
" 将 NERDTree 的窗口设置在 vim 窗口的右侧(默认为左侧)
" let NERDTreeWinPos="right"
" 当打开 NERDTree 窗口时,自动显示 Bookmarks
let NERDTreeShowBookmarks=1

" 显示行号
let NERDTreeShowLineNumbers=1
let NERDTreeAutoCenter=1

" 是否显示隐藏文件
let NERDTreeShowHidden=1

"隐藏目录树种的.pyc文件
let NERDTreeIgnore=['.pyc$', '~$'] "ignore files in NERDTree

" 高亮显示目录树文件
let g:NERDTreeFileExtensionHighlightFullName = 1
let g:NERDTreeExactMatchHighlightFullName = 1
let g:NERDTreePatternMatchHighlightFullName = 1
let g:NERDTreeHighlightFolders = 1

" 更换目录的显示图标
let g:NERDTreeDirArrowExpandable='▷'
let g:NERDTreeDirArrowCollapsible='▼'

" 自动设置python文件为pep8风格
au BufWrite *.py :Autoformat

" 更换主题快捷键
nnoremap :PreviousColorScheme
inoremap :PreviousColorScheme
nnoremap :NextColorScheme
inoremap :NextColorScheme
nnoremap :RandomColorScheme
inoremap :RandomColorScheme
nnoremap :ShowColorScheme
inoremap :ShowColorScheme

"开启代码折叠
set foldmethod=indent
set 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"

</code></pre>
</details>

配置好之后,可以在命令行中直接安装,使用方法如下
```shell
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 %<"
            exec "!time ./%<"
elseif &filetype == 'cpp'
            exec "!g++ % -o %<"
            exec "!time ./%<"
elseif &filetype == 'java'
            exec "!javac %"
            exec "!time java %<"
elseif &filetype == 'sh'
            :!time bash %
elseif &filetype == 'python'
            exec "!time python %"
elseif &filetype == 'html'
            exec "!firefox % &"
elseif &filetype == 'go'
    "        exec "!go build %<"
            exec "!time go run %"
elseif &filetype == 'mkd'
            exec "!~/.vim/markdown.pl % > %.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源和pip
yum install epel-release -y
yum install python2-pip -y
# 自定义部署过程
git clone https://github.com/automationroad/vimIDE_config.git
sh vimIDE_config/latest_deploy_vimIDE.sh

一些实用技巧

1、在vim下复制文本内容时,由于vim自动缩进,造成复制的文本内容跟原来的不同格式,这时可以进入vim,然后设置:set paste 暂时取消自动缩进,复制内容时格式保持原样
2、待补充。。。

效果图

下图中, Last Changed 字段会根据vim修改文件的时间自动更新,特性和vim更新文件修改时间一样,退出时,按 q 或 q! 不更新时间,qw 一定会更新修改时间,x 当文件有修改时间更新修改时间
shell效果图
shell效果图
python效果图
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.gz
tar --no-same-owner -zxf vimcdoc-1.8.0.tar.gz
[ ! -d ~/.vim ] && mkdir ~/.vim
mv vimcdoc-1.8.0 ~/.vim/doc
cd ~/.vim/doc
# 安装中文文档用 i 参数,卸载使用 u 参数
./vimcdoc.sh -i
# 到这一步已经可以打开vim查看中文帮助文档了,如果还是英文,则需要在配置文件修改,以下列出操作
[ ! -f ~/.vimrc ] && touch ~/.vimrc
echo 'set helplang=cn' >> ~/.vimrc
# vim中文文档不会覆盖原英文文档,安装后vim默认使用中文文档。若想使用英文文档,可在vim中执行以下命令:
# :set helplang=en 回车之后 :help 就是英文的help
# 同理,使用以下命令可重新使用中文文档
# :set helplang=cn 回车之后 :help 就是中文的help

快捷键图

vim快捷键

原文地址:https://www.cnblogs.com/AutoSmart/p/10363908.html