• 打造个人的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快捷键

  • 相关阅读:
    博客园 如何给上传的图片添加水印?
    今天把这三篇文章看完(DeepFM/NN/BN)
    今天看了这篇文章,还是要提前做好准备
    POJ1988Cube Stacking
    AcWing 1250. 格子游戏
    POJ 1962 Corporative Network [带权并查集]模板
    AcWing 477. 神经网络
    埃拉托色尼筛法和欧拉筛法
    AcWing 1252. 搭配购买
    AcWing 2128. 狡猾的商人
  • 原文地址:https://www.cnblogs.com/AutoSmart/p/10363908.html
Copyright © 2020-2023  润新知