vim插件打造ide

一直听说vim,emacs两大神器,于是选了一直在用的vim来体验一下
先放个最后的效果图
在这里插入图片描述
最初目的是打算搞出来写django的,于是很多插件配置用的官方文档推荐的
https://code.djangoproject.com/wiki/UsingVimWithDjango

1、首先需要插件管理 Vundle
这个方式只修改当前用户的vim
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
编辑vimrc
vim ~/.vimrc

set nocompatible
filetype on
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
filetype plugin indent on 

安装插件:进入vim,输入 :PluginInstall
或者直接命令行执行 vim +PluginInstall +qall
卸载插件:在vimrc中删除相应行后
进入vim ,输入 :PluginClean
其它用法github上看吧。。。

2、自动补全插件 Plugin ‘Valloric/YouCompleteMe’
https://github.com/Valloric/YouCompleteMe
先用vundle安装,PluginInstall会报错需要单独安装,执行下面步骤即可
PluginInstall过程很慢而且没有进度条显示,可以进入~/.vim/bundle/YouCompleteMe/目录查看大小是否在增长,我的有307M
sudo apt install build-essential cmake python3-dev
cd ~/.vim/bundle/YouCompleteMe
python3 install.py
clang之类的暂时用不到,参数就全都没加

3、目录树显示插件 Plugin ‘scrooloose/nerdtree’
vimrc中配置如下

Plugin 'scrooloose/nerdtree'
let g:NERDTreeChDirMode=2    #将当前目录设置为nerdtree根目录
map <C-n> :NERDTreeToggle<CR>    #设置快捷键,ctrl+n打开nerdtree
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif     #这两行是打开目录是自动打开nerdtree,比如vim . 时
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif  #只剩下nerdtree窗口时自动关闭vim

ctrl+w+w 切换窗口,vim和nerdtree之前切换
shift+c 将当前目录设为根节点
shift+r 刷新当前根目录
o / go将选中文件用buffer打开,不知道为什么help中这样介绍 o: open in prev window ,感觉像是用新窗口打开,但实际上是buffer的方式
直接使用nerdtree创建文件的方法,ctrl+n切到nerdtree,然后输入ma,即可在对应目录中创建新文件,创建目录只需要在输入的文件名后面加上/即可
在这里插入图片描述

4、状态栏,buffer显示等插件 Plugin ‘vim-airline/vim-airline’
使用vundle安装后需要安装对应字体

安装字体方法如下
# clone
git clone https://github.com/powerline/fonts.git --depth=1
# install
cd fonts
./install.sh
# clean-up a bit
cd ..
rm -rf fonts

然后vimrc中加入以下配置
vim中buffer,tab,window的区别介绍就不细说了。。。符合ide标签功能的查下来是buffer比较接近,我就只配置buffer切换的快捷键

Plugin 'vim-airline/vim-airline'
set hidden     #能够使未保存的buffer进行切换
nnoremap <silent> bn :bnext<CR>     #直接输入bn进行buffer切换快捷键
nnoremap <silent> bp :bprevious<CR>
nnoremap <silent> bd :bdelete<CR>   #删除buffer快捷键,这里好像会把buffer全部删掉,使用 :bp|bd # 命令可以实现删除当前buffer功能,但是设置快捷键会报错,不知道怎么解决这点。。。
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show=1
let g:airline_powerline_fonts = 1      #安装字体后加入这个配置参数才能达到预期显示效果
set laststatus=2
set t_Co=256        #256色显示vim,不加这个airline显示颜色不正常

5、tmux插件 Plugin ‘christoomey/vim-tmux-navigator’
这个主要用于弄出vim下面的那个独立出来的终端效果,如果能够习惯tmux的分屏使用,其实这个插件不装也可以
首先安装tmux
apt-get install tmux
我使用的是github中作者推荐的另一种配置,详细链接如下
https://www.codeography.com/2013/06/19/navigating-vim-and-tmux-splits
~/.vimrc文件如下

Plugin 'christoomey/vim-tmux-navigator'
let g:tmux_navigator_no_mappings = 1
let g:tmux_navigator_save_on_switch = 2
if exists('$TMUX')
  function! TmuxOrSplitSwitch(wincmd, tmuxdir)
    let previous_winnr = winnr()
    silent! execute "wincmd " . a:wincmd
    if previous_winnr == winnr()
      call system("tmux select-pane -" . a:tmuxdir)
      redraw!
    endif
  endfunction

  let previous_title = substitute(system("tmux display-message -p '#{pane_title}'"), '\n', '', '')
  let &t_ti = "\<Esc>]2;vim\<Esc>\\" . &t_ti
  let &t_te = "\<Esc>]2;". previous_title . "\<Esc>\\" . &t_te

  nnoremap <silent> <C-h> :call TmuxOrSplitSwitch('h', 'L')<cr>
  nnoremap <silent> <C-j> :call TmuxOrSplitSwitch('j', 'D')<cr>
  nnoremap <silent> <C-k> :call TmuxOrSplitSwitch('k', 'U')<cr>
  nnoremap <silent> <C-l> :call TmuxOrSplitSwitch('l', 'R')<cr>
else
  map <C-h> <C-w>h
  map <C-j> <C-w>j
  map <C-k> <C-w>k
  map <C-l> <C-w>l
endif

~/.tmux.conf配置如下

bind -n C-h run "(tmux display-message -p '#{pane_title}' | grep -iq vim && tmux send-keys C-h) || tmux select-pane -L"
bind -n C-j run "(tmux display-message -p '#{pane_title}' | grep -iq vim && tmux send-keys C-j) || tmux select-pane -D"
bind -n C-k run "(tmux display-message -p '#{pane_title}' | grep -iq vim && tmux send-keys C-k) || tmux select-pane -U"
bind -n C-l run "(tmux display-message -p '#{pane_title}' | grep -iq vim && tmux send-keys C-l) || tmux select-pane -R"
set -g default-terminal "screen-256color"    #这个是为了让tmux256色显示,对应airline的配置,但是并没有生效!我还是在每次打开tmux加上 -2 参数,xshell中无法生效原因可能跟xshell登录终端后的系统环境参数有关,修改环境变量$TERM可以解决,或者alias tmux='tmux -2'
set -g mouse on    #这个配置作用是能够使用鼠标调整分框的大小,加了这个后xshell进入tmux后无法使用选择复制

然后我们输入命令新建一个tmux会话
tmux new -s vim-test
输入ctrl+b,然后再输入 "
进行上下分屏,具体tmux使用方法不详细说了。。。
正常的tmux选择上下分屏需要输入ctrl+b,然后用方向键选着
如果我们上面的配置生效了,可直接使用ctrl+hjkl 进行上下左右分屏选择
然后我们在上面的分屏中打开vim就可以实现,上面vim,下面打开一个终端了,
ctrl+j/k 进行上下分屏选择
这里设置ctrl+h快捷键后可能会出现在tmux终端中敲命令行无法使用退格键的问题(在使用远程工具时会出现,比如使用xshell远程登录时)
原因是因为xshell默认发送的退格键字符也是ctrl+h(也可能是因为tmux中本来就只识别^?作为退格键,这里没有深入研究),设置快捷键后会无法识别,这里我们在属性设置中把退格键换成^?即可
在这里插入图片描述
补充一下tmux中alt键无法使用的办法,我发现使用ctrl+b,alt+方向键无法调整窗格大小,同样是上面那个图的页面,因为经常用左alt进行xshell标签页切换,就把右alt改了
在这里插入图片描述
别的插件如下
Plugin ‘SirVer/ultisnips’
Plugin ‘taglist.vim’
Plugin ‘ctrlpvim/ctrlp.vim’ #这个看github上airline插件作者说在airline里集成了,但是我只装了airline的情况下并不能成功调出来,原因未知,有知道的大佬求助。。。
这些没遇到什么坑,直接PluginInstall装上就能用,详细配置下面我放出来vimrc全部内容

我的~/.vimrc文件

set sw=4
set ts=4
set sts=4
set number

set nocompatible              " be iMproved, required
filetype on                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

Plugin 'Valloric/YouCompleteMe'
let g:ycm_collect_identifiers_from_tags_files = 1 " Let YCM read tags from Ctags file
let g:ycm_use_ultisnips_completer = 1 " Default 1, just ensure
let g:ycm_seed_identifiers_with_syntax = 1 " Completion for programming language's keyword
let g:ycm_complete_in_comments = 1 " Completion in comments
let g:ycm_complete_in_strings = 1 " Completion in string

Plugin 'scrooloose/nerdtree'
let g:NERDTreeChDirMode=2
map <C-n> :NERDTreeToggle<CR>
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" Track the engine.
Plugin 'SirVer/ultisnips'

" Snippets are separated from the engine. Add this if you want them:
Plugin 'honza/vim-snippets'
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger       = "<c-j>"
let g:UltiSnipsJumpForwardTrigger  = "<c-j>"
let g:UltiSnipsJumpBackwardTrigger = "<c-p>"
let g:UltiSnipsListSnippets        = "<c-k>" "List possible snippets based on current file

Plugin 'taglist.vim'
let Tlist_Use_Right_Window=1
let Tlist_GainFocus_On_ToggleOpen=1
 
 Plugin 'vim-airline/vim-airline'
 set hidden
 nnoremap <silent> bn :bnext<CR>
 nnoremap <silent> bp :bprevious<CR>
 nnoremap <silent> bd :bdelete<CR>
 let g:airline#extensions#tabline#enabled = 1
 let g:airline#extensions#tabline#buffer_nr_show=1
 let g:airline_powerline_fonts = 1
 set laststatus=2
 set t_Co=256
 
 Plugin 'ctrlpvim/ctrlp.vim'
 
 Plugin 'christoomey/vim-tmux-navigator'
 let g:tmux_navigator_no_mappings = 1
 let g:tmux_navigator_save_on_switch = 2
 if exists('$TMUX')
   function! TmuxOrSplitSwitch(wincmd, tmuxdir)
     let previous_winnr = winnr()
     silent! execute "wincmd " . a:wincmd
     if previous_winnr == winnr()
       call system("tmux select-pane -" . a:tmuxdir)
       redraw!
     endif
   endfunction
 
   let previous_title = substitute(system("tmux display-message -p '#{pane_title}'"), '\n', '', '')
   let &t_ti = "\<Esc>]2;vim\<Esc>\\" . &t_ti
   let &t_te = "\<Esc>]2;". previous_title . "\<Esc>\\" . &t_te
 
   nnoremap <silent> <C-h> :call TmuxOrSplitSwitch('h', 'L')<cr>
   nnoremap <silent> <C-j> :call TmuxOrSplitSwitch('j', 'D')<cr>
   nnoremap <silent> <C-k> :call TmuxOrSplitSwitch('k', 'U')<cr>
   nnoremap <silent> <C-l> :call TmuxOrSplitSwitch('l', 'R')<cr>
 else
   map <C-h> <C-w>h
   map <C-j> <C-w>j
   map <C-k> <C-w>k
   map <C-l> <C-w>l
 endif

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

里面的vim插件已经包含了taglist,omnicppcomplete等插件,无需再下载,详细的配置参考.vimrc,注意快捷键使用即可。有什么不喜欢和bug的地方,自行调整.vimrc。ctags命令工具还是要下载安装的。 1. 安装ctags和cscope yum install即可 在.vimrc文件中增加map :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 就可以在vim中使用快捷键F12来随时生成当前目录下的tags,这样后续配好omni自动补全以后,自己工程下定义的类中的public成员,也可以通过. :: ->来自动补全了。全局定义的查找。局部的符号不会生成tags,这个要使用superTab。 Ctrl ] 跳转到光标所在位置的符号的定义,前提是tags中有。 Ctrl t 回到上次跳转前的位置。 2. 下载其他vim插件 echofunc.vim 在底部状态栏显示函数原型 Alt - 和 Alt + 可以在多个函数原型间切换 winmanager 侧边栏显示文件浏览 直接把.vim文件拷贝到~/.vim/plugin/下即可 自动打开winmanager,参考http://blog.youkuaiyun.com/xuanwu_yan/article/details/43736299 : 在.vimrc中添加: let g:autoOpenWinManager=1 然后需要手动修改winmanager.vim文件,在末尾加入: " set auto open WinManager if g:autoOpenWinManager autocmd VimEnter * nested call s:StartWindowsManager() endif 调整winmanager窗口的大小,参考http://blog.youkuaiyun.com/yangzhongxuan/article/details/7944927 : let g:bufExplorerMaxHeight=30 let g:bufExplorerMoreThanOne=0 miniBufferExplorer,直接下载minibufexpl.vim 折叠设置 " --fold setting --- set foldmethod=syntax "用语法高亮来定义折叠 set foldlevel=100 "启动vim时不要自动折叠代码 set foldcolumn=5 "设置折叠栏宽度 常用命令: za 打开/关闭在光标下的折叠 zA 循环地打开/关闭光标下的折叠 zc 关闭close在光标下的折叠 zo 打开在光标下的折叠 安装SuperTab,参考http://blog.youkuaiyun.com/bokee/article/details/6633193 ,配了之后没反应 使Tab键具有更快捷的上下文提示功能,从http://www.vim.org/scripts/script.php?script_id=1643 下载安装,它是个vba文件,即Vimball格式的安装包,安装方法: 1)用vim打开supertab.vba文件 2)在vim命令行下运行命令UseVimball ~/.vim。就会将安装包安装到~/.vim目录下。 在~/.vimrc文件中添加: let g:SuperTabDefaultCompletionType="" 使用Ctrl - P键弹出SuperTab的自动补全 Ctrl - w - ] 弹出定义的位置 Ctrl - ] 跳到符号定义的位置,Ctrl - t返回上次跳走的位置 Ctrl-x Ctrll-o 弹出omni自动补全 F12 生成当前目录下的tags
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值