zoukankan      html  css  js  c++  java
  • 将vim打造为强大的IDE

    PS:文章最后是安装好之后的图

    前言:首先需要有 vim python2或3 git

    下载:sudo apt-get install xxx

    一.安装插件管理器vim-plug(亲测比vundle好用-个人观点)
    1.检查当前用户下是否有vim文件夹:~/.vim
    没有,自己创建: mkdir ~/.vim
    2.创建相应的文件夹(在~/.vim下创建):
    mkdir autoload
    mkdir plugged //存放plug下载的.vim插件
    mkdir plugin //通用文件夹,存放自己网上下载的插件
    mkdir syntax //存放有关文本(比如c语言)语法相关的插件
    mkdir doc //存放说明文档

    3.安装vim-plug(即plug.vim)
    打开终端:

    cd autoload //进入autoload文件夹

    curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

    此处说明:没有安装过curl的先下载安装curl,再执行上述命令
    sudo apt-get install curl

    4.安装好plug后,即可使用它安装管理其他插件。
    方法:
    打开.vimrc配置文件: sudo vim ~/.vimrc
    添加配置内容:

    call plug#begin('~/.vim/plugged') //必须有

    "要安装/管理的插件
    "建议插件下载完成后再添加配置内容
    "当执行PlugIstall命令会执行当此处,去官网下载对应的插件,如:
    "Plug 'itchyny/lightline.vim'

    call plug#end() //必须有

    二.安装相关插件(建议先安装后配置)
    1.安装YouCompleteMe语法补全插件(难装的一pi...这个插件没有使用plug安装)
    1.1 先下载依赖:
    sudo apt-get install build-essential
    sudo apt-get install cmake
    sudo apt-get install python3-dev

    1.2 下载安装YouCompleteMe(步骤)
    cd ~/.vim
    mkdir bundle
    cd bundle
    git clone https://github.com/Valloric/YouCompleteMe.git
    cd YouCompleteMe //下载完成后才进入YCM的文件夹

    安装语言特性,相关语言特性自己百度
    ./install.py --all //此为安装所有语言特性

    补充说明:执行上述命令后可能会出现一条
    git submodule update --init --recursive
    这是依赖的子目录,复制下来执行即可
    执行完成后重新执行./install.py --all安装语言特性

    2. 安装其他插件
    2.1 //打开~/.vimrc文件
    sudo vim ~/.vimrc
    2.2 //写入以下内容(安装插件)
    "======================================================
    set nocompatible
    filetype on

    call plug#begin('~/.vim/plugged')

    " 撤销
    Plug 'mbbill/undotree'

    " C++语法高亮
    Plug 'octol/vim-cpp-enhanced-highlight'

    " 搜索引擎
    Plug 'mileszs/ack.vim'

    " 界面
    Plug 'mhinz/vim-startify'

    " 代码检测
    Plug 'w0rp/ale'

    "nerdtree 目录树
    Plug 'scrooloose/nerdtree'

    "优化vim界面"
    Plug 'vim-airline/vim-airline'

    " vim-scripts 的插件
    Plug 'majutsushi/tagbar'

    Plug 'Yggdroot/indentLine'

    Plug 'Raimondi/delimitMate'

    " 注释加空格
    Plug 'scrooloose/nerdcommenter'


    call plug#end()

    "======================================================
    2.3 wq保存退出后,命令行执行vim
    进入vim, 键入: PlugInstall 进行下载
    出现Done!即插件下载完成
    注意:若出现“不是编辑器的命令: PlugIstall”
    关闭终端再重新打开进入vim重新执行下载

    3. 下载搜索引擎
    curl -LO https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb
    sudo dpkg -i ripgrep_0.10.0_amd64.deb

    4. 都下载完成后进行配置(~/.vimrc中配置)
    4.1 sudo vim ~/.vimrc
    根据需要自行配置,以下是我的配置
    "========================================================

    set nocompatible
    filetype on

    call plug#begin('~/.vim/plugged')

    " YouCompleteMe
    set runtimepath+=~/.vim/bundle/YouCompleteMe
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口"
    let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM基于标签引擎
    let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释与字符串中的内容也用于补全
    let g:syntastic_ignore_files=[".*.py$"]
    let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全
    let g:ycm_complete_in_comments = 1
    let g:ycm_confirm_extra_conf = 0 " 关闭加载.ycm_extra_conf.py提示
    let g:ycm_key_list_select_completion = ['<c-n>', '<Down>'] " 映射按键,没有这个会拦截掉tab, 导致其他插件的tab不能用.
    let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
    let g:ycm_complete_in_comments = 1 " 在注释输入中也能补全
    let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全
    let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释和字符串中的文字也会被收入补全
    let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
    let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查
    inoremap <expr> <CR> pumvisible() ? "<C-y>" : "<CR>" " 回车即选中当前项
    nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
    let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项


    " 撤销
    Plug 'mbbill/undotree'
    nnoremap <F6> :UndotreeToggle<cr>
    set undodir=~/.undodir/
    set undofile

    " C++语法高亮
    Plug 'octol/vim-cpp-enhanced-highlight'
    "高亮类,成员函数,标准库和模板
    let g:cpp_class_scope_highlight = 1
    let g:cpp_member_variable_highlight = 1
    let g:cpp_concepts_highlight = 1
    let g:cpp_experimental_simple_template_highlight = 1

    " 搜索引擎
    Plug 'mileszs/ack.vim'
    "<F4>进行搜索,同时不自动打开第一个匹配的文件"
    map <F4> :Ack!<Space>
    "调用rg进行搜索
    if executable('rg')
    let g:ackprg = 'rg --vimgrep'
    endif
    "高亮搜索关键词
    let g:ackhighlight = 1
    "修改快速预览窗口高度为15
    let g:ack_qhandler = "botright copen 15"
    "在QuickFix窗口使用快捷键以后,自动关闭QuickFix窗口
    let g:ack_autoclose = 1
    "使用ack的空白搜索,即不添加任何参数时对光标下的单词进行搜索,默认值为1,表示开启,置0以后使用空白搜索将返回错误信息
    let g:ack_use_cword_for_empty_search = 1


    " 界面
    Plug 'mhinz/vim-startify'
    "设置书签
    let g:startify_bookmarks = [
    '~/Project/test.cpp',
    ]
    "起始页显示的列表长度
    let g:startify_files_number = 20
    "自动加载session
    let g:startify_session_autoload = 1
    "过滤列表,支持正则表达式
    let g:startify_skiplist = [
    '^/tmp',
    ]


    " 代码检测
    Plug 'w0rp/ale'
    "始终开启标志列
    let g:ale_sign_column_always = 1
    let g:ale_set_highlights = 0
    "自定义error和warning图标
    let g:ale_sign_error = '✗'
    let g:ale_sign_warning = '⚡'
    "在vim自带的状态栏中整合ale
    let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK']
    "显示Linter名称,出错或警告等相关信息
    let g:ale_echo_msg_error_str = 'E'
    let g:ale_echo_msg_warning_str = 'W'
    let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
    "普通模式下,sp前往上一个错误或警告,sn前往下一个错误或警告
    nmap sp <Plug>(ale_previous_wrap)
    nmap sn <Plug>(ale_next_wrap)
    "<Leader>s触发/关闭语法检查
    nmap <Leader>s :ALEToggle<CR>
    "<Leader>d查看错误或警告的详细信息
    nmap <Leader>d :ALEDetail<CR>
    "文件内容发生变化时不进行检查
    let g:ale_lint_on_text_changed = 'never'
    "打开文件时不进行检查
    let g:ale_lint_on_enter = 0
    set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y - %H:%M")} %{ALEGetStatusLine()}

    "nerdtree目录树 F2打开
    Plug 'scrooloose/nerdtree'
    map <F2> :NERDTreeToggle<CR>
    let NERDTreeShowLineNumbers=1
    let NERDTreeAutoCenter=1
    let NERDTreeShowHidden=1
    let NERDTreeWinSize=30
    let g:nerdtree_tabs_open_on_console_startup=1
    let NERDTreeIgnore=['.pyc','~$','.swp']
    let NERDTreeShowBookmarks=1
    autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

    "优化vim界面"
    Plug 'vim-airline/vim-airline'
    " 显示颜色
    set t_Co=256
    set laststatus=2
    " 使用powerline打过补丁的字体
    let g:airline_powerline_fonts = 1
    "m,d,y,H,M分别表示月,日,年,时,分,也就是相应英文的首字母
    let g:airline_section_b = '%{strftime("%m/%d/%y - %H:%M")}'
    " 开启tabline
    let g:airline#extensions#tabline#enabled = 1
    " tabline中当前buffer两端的分隔字符
    let g:airline#extensions#tabline#left_sep = ' '
    " tabline中未激活buffer两端的分隔字符
    let g:airline#extensions#tabline#left_alt_sep = ' '
    " tabline中buffer显示编号
    let g:airline#extensions#tabline#buffer_nr_show = 1
    let g:airline#extensions#tabline#fnamemod = ':t'
    " 映射切换buffer的键位
    nnoremap [b :bp<CR>
    nnoremap ]b :bn<CR>
    " 映射<leader>num到num buffer
    let g:mapleader = ","
    map <leader>1 :b 1<CR>
    map <leader>2 :b 2<CR>
    map <leader>3 :b 3<CR>
    map <leader>4 :b 4<CR>
    map <leader>5 :b 5<CR>
    map <leader>6 :b 6<CR>
    map <leader>7 :b 7<CR>
    map <leader>8 :b 8<CR>
    map <leader>9 :b 9<CR>


    " vim-scripts 的插件
    Plug 'majutsushi/tagbar'
    "ctags 配置:F3快捷键显示程序中的各种tags,包括变量和函数等。
    map <F3> :TagbarToggle<CR>
    let g:tagbar_ctags_bin='/usr/bin/ctags'
    let g:tagbar_width=26
    nnoremap <Leader>y :TagbarToggle<CR>
    let g:tagbar_autofocus=1


    Plug 'Yggdroot/indentLine'

    Plug 'Raimondi/delimitMate'

    " 注释加空格
    Plug 'scrooloose/nerdcommenter'
    let g:NERDSpaceDelims=1
    "进入visual模式,选中多行
    "<leader>cc/cu 加/解

    call plug#end()


    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    "新建.c,.h,.sh,.java文件,自动插入文件头
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    autocmd BufNewFile *.cpp,*.[ch],*.sh":call SetTitle()"
    ""定义函数SetTitle,自动插入文件头
    func SetTitle()
    "如果文件类型为.sh文件
    if &filetype == 'sh'
    call setline(1, "##########################################################################")
    call append(line("."), "# File Name: ".expand("%"))
    call append(line(".")+1, "# Author: Neko ")
    call append(line(".")+2, "# mail: Neko_cmy@163.com")
    call append(line(".")+3, "# Created Time: ".strftime("%c"))
    call append(line(".")+4, "#########################################################################")
    call append(line(".")+5, "#!/bin/zsh")
    call append(line(".")+6, "PATH=/home/edison/bin:/home/edison/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/work/tools/gcc-3.4.5-glibc-2.3.6/bin")
    call append(line(".")+7, "export PATH")
    call append(line(".")+8, "")
    else
    call setline(1, "/*************************************************************************")
    call append(line("."), " > File Name: ".expand("%"))
    call append(line(".")+1, " > Author: Neko ")
    call append(line(".")+2, " > Mail: Neko_cmy@163.com ")
    call append(line(".")+3, " > Created Time: ".strftime("%c"))
    call append(line(".")+4, " ************************************************************************/")
    call append(line(".")+5, "")
    endif
    if &filetype == 'cpp'
    call append(line(".")+6, "#include <iostream>")
    call append(line(".")+7, "#include <cstdio>")
    call append(line(".")+8, "#include <cstdlib>")
    call append(line(".")+9, "#include <cstring>")
    call append(line(".")+10, "#include <algorithm>")
    call append(line(".")+11, "#include <vector>")
    call append(line(".")+12, "#include <stack>")
    call append(line(".")+13, "#include <queue>")
    call append(line(".")+14, "#include <list>")
    call append(line(".")+15, "#include <map>")
    call append(line(".")+16, "#include <cmath>")
    call append(line(".")+17, "#include <string.h>")
    call append(line(".")+18, "#include <bitset>")
    call append(line(".")+19, "#include <fstream>")
    call append(line(".")+20, "#include <set>")
    call append(line(".")+21, "#include <climits>")
    call append(line(".")+22, "")
    call append(line(".")+23, "using namespace std;")
    call append(line(".")+24, "typedef long long ll;")
    call append(line(".")+25, "typedef unsigned int uint;")
    call append(line(".")+26, "typedef long double lb;")
    call append(line(".")+27, "const double PI = acos(-1.0);")
    call append(line(".")+28, "const double eps = 1e-6;")
    call append(line(".")+29, "const int INF = 0x3f3f3f3f;")
    call append(line(".")+30, "const int maxn = 100;")
    call append(line(".")+31, "")
    call append(line(".")+32, "int main()")
    call append(line(".")+33, "{")
    call append(line(".")+34, " ")
    call append(line(".")+35, " ")
    call append(line(".")+36, " return 0;")
    call append(line(".")+37, "}")
    endif
    if &filetype == 'c'
    call append(line(".")+6, "#include <stdio.h>")
    call append(line(".")+7, "#include <stdlib.h>")
    call append(line(".")+8, "#include <string.h>")
    call append(line(".")+9, "")
    endif
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
    endfunc


    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    "键盘命令
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    nmap <leader>w :w!<cr>
    nmap <leader>f :find<cr>

    " 映射全选+复制 ctrl+a
    map <C-A> ggVGY
    map! <C-A> <Esc>ggVGY
    map <F12> gg=G
    " 选中状态下 Ctrl+c 复制
    vmap <C-c> "+y


    "C,C++编译运行
    map <F5> :call CompileRunGcc()<CR>
    func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
    exec "!g++ % -o %<"
    exec "! ./%<"
    elseif &filetype == 'cpp'
    exec "!g++ % -o %<"
    exec "! ./%<"
    elseif &filetype == 'java'
    exec "!javac %"
    exec "!java %<"
    elseif &filetype == 'sh'
    :!./%
    endif
    endfunc

    "C,C++的调试
    map <F8> :call Rungdb()<CR>
    func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
    endfunc


    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    ""其他设置
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " 设置当文件被改动时自动载入
    set autoread
    " quickfix模式
    autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
    "代码补全
    set completeopt=preview,menu
    "允许插件
    filetype plugin on
    "共享剪贴板
    set clipboard=unnamed

    "从不备份
    set nobackup
    "make 运行
    :set makeprg=g++ -Wall %
    "自动保存
    set autowrite
    set ruler " 打开状态栏标尺
    set cursorline " 突出显示当前行
    set magic " 设置魔术
    set guioptions-=T " 隐藏工具栏
    set guioptions-=m " 隐藏菜单栏

    " 设置在状态行显示的信息
    set foldcolumn=0
    set foldmethod=indent
    set foldlevel=3
    set foldenable " 开始折叠
    " 不要使用vi的键盘模式,而是vim自己的
    set nocompatible
    " 语法高亮
    set syntax=on
    " 去掉输入错误的提示声音
    set noeb
    " 在处理未保存或只读文件的时候,弹出确认
    set confirm
    " 自动缩进
    set autoindent
    set cindent
    " Tab键的宽度
    set tabstop=4
    " 统一缩进为4
    set softtabstop=4
    set shiftwidth=4
    " 不要用空格代替制表符
    set noexpandtab
    " 在行和段开始处使用制表符
    set smarttab
    " 显示行号
    set number
    " 历史记录数
    set history=1000
    "禁止生成临时文件
    set nobackup
    set noswapfile
    "搜索忽略大小写
    set ignorecase
    "搜索逐字符高亮
    set hlsearch
    set incsearch
    "行内替换
    set gdefault
    "编码设置
    set enc=utf-8
    set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
    "语言设置
    set langmenu=zh_CN.UTF-8
    set helplang=cn
    " 状态行显示的内容(包括文件类型和解码)
    set statusline=%F%m%r%h%w [FORMAT=%{&ff}] [TYPE=%Y] [POS=%l,%v][%p%%] %{strftime("%d/%m/%y - %H:%M")}
    set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
    " 总是显示状态行
    set laststatus=2
    " 命令行(在状态行下)的高度,默认为1,这里是2
    set cmdheight=2
    " 侦测文件类型
    filetype on
    " 载入文件类型插件
    filetype plugin on
    " 为特定文件类型载入相关缩进文件
    filetype indent on
    " 保存全局变量
    set viminfo+=!
    " 带有如下符号的单词不要被换行分割
    set iskeyword+=_,$,@,%,#,-
    " 字符间插入的像素行数目
    set linespace=0
    " 增强模式中的命令行自动完成操作
    set wildmenu
    " 使回格键(backspace)正常处理indent, eol, start等
    set backspace=2
    " 允许backspace和光标键跨越行边界
    set whichwrap+=<,>,h,l
    " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
    set mouse=a
    set selection=exclusive
    set selectmode=mouse,key
    " 通过使用: commands命令,告诉我们文件的哪一行被改变过
    set report=0
    " 在被分割的窗口间显示空白,便于阅读
    set fillchars=vert: ,stl: ,stlnc:
    " 高亮显示匹配的括号
    set showmatch
    " 匹配括号高亮的时间(单位是十分之一秒)
    set matchtime=1
    " 光标移动到buffer的顶部和底部时保持3行距离
    set scrolloff=3
    " 为C程序提供自动缩进
    set smartindent
    " 高亮显示普通txt文件(需要txt.vim脚本)
    au BufRead,BufNewFile * setfiletype txt
    "自动补全
    :inoremap ( ()<ESC>i
    :inoremap ) <c-r>=ClosePair(')')<CR>
    :inoremap [ []<ESC>i
    :inoremap ] <c-r>=ClosePair(']')<CR>
    :inoremap " ""<ESC>i
    :inoremap ' ''<ESC>i
    function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
    return "<Right>"
    else
    return a:char
    endif
    endfunction
    filetype plugin indent on
    "打开文件类型检测, 加了这句才可以用智能补全
    set completeopt=longest,menu
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    "========================================================================

    以上是我搜罗了网上各种配置方法并实践的结果, vim插件还有很多种,可自行查找安装、配置

     -------------------------------------------------------------------------------------------------------------

    补上使用小tips:

    鼠标可随意选中目标位置
    打开/关闭左侧目录树:F2
    打开搜索栏:F4 输入关键字 enter回车即搜索
    关闭某栏目框:鼠标点击想要关闭的栏框 按下esc 键入 : q 即可退出
    撤销:F6

    -----------------------------------------------------------------------------------------------------------------------

     

  • 相关阅读:
    Key-Value Memory Network
    Deep Mask Memory Network with Semantic Dependency and Context Moment for Aspect Level Sentiment Clas
    Deep Memory Network在Aspect Based Sentiment方向上的应用
    Deep Memory Network 深度记忆网络
    Self Attention 自注意力机制
    Attention基本公式及其变种
    *端策略优化算法(PPO)
    Policy Gradient 算法
    一本通 农场派对
    A
  • 原文地址:https://www.cnblogs.com/NekoCc/p/13139321.html
Copyright © 2011-2022 走看看