文章目录
vim中buffer、window、tag概念
- Buffer:
vim中的buffer概念就是打开了一个文件的内存中的缓存,vim每打开一个文件,将创建一个buffer,一个文件唯一对应一个buffer,当用vim连续打开多个文件的时候,再关闭其中的文件的时候,buffer并没有关闭,依然存在;直到关闭vim才清除所有buffers。vim中可用命令
buffers 或者 ls:查看存在的buffer
bnext、bprevious、blast、bfirst:显示下一个、前一个、最后一个、第一个buffer
bdelete:将缓冲区从buffers列表中删除,buffers!还是会让它再度现身
bwipe:彻底删除缓冲区
- window:
window只是负责显示缓存数据,当执行q,退出的是window,buffer依然存在。一个window只能显示一个buffer,一个buffer可以在多个window上显示。
- tag:
tag就是window的集合,是一种布局。不同tag之间的window是相互不影响。
vundle
- 功能:管理插件的插件
- GitHub项目地址
- 安装:
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/Vundle.vim
- .vimrc的配置:
(1)这段配置需要放在.vimrc最前面
(2) 添加的插件需要放在 call vundle#begin()和 call vundle#end() 之间
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
"中间添加需要安装的插件
call vundle#end() " required
filetype plugin indent on " required
"所有其他配
- 安装插件
1. 在.vimrc中 vundle#begin() 和 vundle#end() 之间添加安装的插件,格式如下:
1.托管在GitHub上:
Plugin '用户名/仓库名' 例子: Plugin 'scrooloose/nerdtree'
2.插件在本地仓库:
Plugin 'file:///home/gmarik/path/to/plugin'
3. 插件从"https://www.vim.org/scripts/"安装
Plugin '插件名'
2. 打开vim,运行:PluginInstall 或者直接运行:vim +PluginInstall +qall
- 清除插件
1. 把.vimrc中的想删除插件的一行 删除
2. 打开vim,运行:PluginClean
功能 | 命令 |
---|---|
安装插件 | PluginInstall |
清除插件 | PluginClean |
查看帮助 | h Vundle |
更新插件 | PluginUpdate |
列出插件 | PluginList |
- 常用插件
Plugin 'VundleVim/Vundle.vim' "中间添加需要安装的插件
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/nerdcommenter'
Plugin 'jiangmiao/auto-pairs'
Plugin 'vim-airline/vim-airline'
Plugin 'mhinz/vim-startify'
Plugin 'majutsushi/tagbar'
Plugin 'Valloric/YouCompleteMe'
NERDTree
-
显示目录树
-
安装:
git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/NERDTree
或者通过Vundle安装:Plugin 'scrooloose/nerdtree'
-
使用:?:打开帮助文档,再按一次退出帮助文档
1. 文件添加、删除
r/R:刷新光标所在的目录 / 根目录
m:打开目录(针对文件操作)
ma:当前文件夹下新建文件(目录在名字后面加 /)
mm:重命名/移动当前文件
md:删除当前文件
mc:复制当前文件到其他地方
。。。。。。。。。具体再查看。。。。。。。。。
2.打开文件
o/go:以buffer的形式打开文件,后者光标还停留在nerdtree中
s/gs:垂直分屏打开,后者光标在nerdtree中
3. 目录操作
O:递归打开当前目录
X:递归关闭子目录
x:收起父目录
cd:改变 选择的目录 为 当前目录
C:改变 选择的目录 为 根目录 (根目录只是针对NERDTree而言)
CD:改变当前目录为根目录
u/U:将上级目录设为根目录,U的话保持原来打开的状态
4.目录的移动
P(大): 去root目录
p(小):去父目录
K:去第一个同级目录
J:去最后一个同级目录
- .vimrc的配置
map <leader>t :NERDTreeToggle<CR> "\t 打开关闭NERDTree
let NERDTreeShowLineNumbers=1 "NERDTree显示行号
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif "NERDTree是最后一个窗口,自动关闭
let NERDTreeIgnore=['\.pyc','\~$','\.swp'] "忽略带此后缀名的文件
"let g:nerdtree_tabs_open_on_console_startup=1 "如果安装了vim-nerdtree-tabs,tabs之间共享nerdtree
autocmd FileType nerdtree noremap <buffer> <tab> <nop> "tab 键对于nerdtree窗口无效(防止在nerdtree窗口切换buffer)
autocmd FileType nerdtree noremap <buffer> <S-tab> <nop>"Shift-tab 键对于nerdtree窗口无效
nerdcommenter
-
功能:快速注释、解开注释
-
安装 :通过Vundle :Plugin ‘scrooloose/nerdcommenter’
-
使用:
- <leader>cc快捷键进行注释选中的行,<leader>cu进行反注释
- <leader>c<space> 在注释/非注释状态之间切换
- .vimrc的配置
" Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } } "自定义注释符
let g:NERDDefaultAlign = 'left' "左对齐 注释符
let g:NERDCompactSexyComs = 1 " 和上一个一起使用,多行注释 ,注释符全部都在行首
let g:NERDTrimTrailingWhitespace = 1 "uncomment的时候,修减行末的空格
vim-startify
- 功能:vim起始页
- github地址
- 安装 :通过Vundle :Plugin ‘mhinz/vim-startify’
- .vimrc的配置
let g:startify_files_number = 5 "每个列表长度
let g:startify_session_autoload = 1 "自动会话
" 设置书签
let g:startify_bookmarks = [
\ '~/Project/test.cpp',
\]
" 设置头部信息
let g:startify_custom_header = [
\ ' ',
\ ' __ ',
\ ' __ __ /\_\ ',
\ ' /\ \/\ \\/\ \ /'' __` _',
\ ' \ \ \_/\ \',
\ ' \ \\ \_\ ',
\ ' \/__/ \/_/\/_ ',
\ ' ',
\ ]
YouCompleteMe(强大)
- 功能:自动补全
- github地址
- 安装(时间有点长) :通过Vundle :Plugin ‘Valloric/YouCompleteMe’
步骤(失败再参照github详细说明):
- sudo apt install build-essential cmake python3-dev
- cd ~/.vim/bundle/YouCompleteMe
- python3 install.py --clang-completer(可能也有不成功的时候)
- cd ~/.vim/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py
- 打开.ycm_extra_conf.py文件,在flags里面的最下面添加(如需要补全其他库,按照格式添加即可,注意后面 有逗号)
'-isystem',
'/usr/include/c++/5.4.0',
'-isystem',
'/usr/include/x86_64-linux-gnu/c++',
'-isystem',
'/usr/include',
'-isystem',
'/usr/include',
'-isystem',
'/usr/include/eigen3',
'-isystem',
'/usr/local/include/opencv4',
'-isystem',
'/usr/local/include/pcl-1.9',
- 配置.vimrc
let g:ycm_global_ycm_extra_conf = '~/.vimrc/YouCompleteMe/third_party/ycm/.ycm_extra_conf.py'
- .vimrc的配置
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>"定义申明之间跳转
set completeopt-=preview " 在接受补全后不分裂出一个窗口显示接受的项
"let g:ycm_seed_identifiers_with_syntax = 1"关键字补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释与字符串中的内容也用于补全
let g:ycm_complete_in_comments = 1 " 在注释输入中也能补全
let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全
let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查
vim-airline
-
功能:界面美化,显示buffer等
-
安装 :通过Vundle :Plugin ‘vim-airline/vim-airline’
-
.vimrc的配置
" Enable the list of buffers
let g:airline#extensions#tabline#enabled = 1
" Show just the filename
let g:airline#extensions#tabline#fnamemod = ':t'
map <leader>1 <Plug>AirlineSlectTab1 "\1 映射成 :选择第一个buffer
map <leader>2 <Plug>AirlineSlectTab2
map <leader>3 <Plug>AirlineSlectTab3
map <leader>4 <Plug>AirlineSlectTab4
map <leader>5 <Plug>AirlineSlectTab5
map <leader>6 <Plug>AirlineSlectTab6
map <leader>7 <Plug>AirlineSlectTab7
map <leader>8 <Plug>AirlineSlectTab8
map <leader>9 <Plug>AirlineSlectTab9
auto-pairs
-
功能:自动补全括号
-
安装 :通过Vundle :Plugin ‘jiangmiao/auto-pairs’
-
.vimrc的配置
let g:AutoPairsFlyMode =1 "飞行模式开启,默认不开启,可以跨括号跳出,如 ([foo|]) 按)之后会直接跳出来 ([foo]) |
let g:AutoPairsMapSpace = 1 " 把SPACE键映射为在括号两侧添加空格
ctags
- 功能:函数、变量的跳转
- 安装:
这个并不是插件,而是可执行程序,是用来对代码建索引,方便查找的,有些Linux版本是自带ctags的,如果没有,按如下方式安装:sudo apt-get install ctags
- 生成ags:
递归当前目录中所有文件tags:ctags -R
特定的文件:ctags *.c *.h
系统库tags:ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
C++文件tags:ctags -I __THROW -I __THROWNL -I __attribute_pure__ -I __nonnull -I __attribute__ -R --c++-kinds=+px --fields=+iaS --extra=+q
- .vimrc中设置:
set tags+=~/.vim/systags
- 操作:
Ctrl+]:跳到定义处
Ctrl+o/t:跳回上次处
:tn 下一个
:tp 上一个
:ts 列出所有
tagbar
- 功能:函数、变量的查看
- github地址
- 安装 :通过Vundle :Plugin ‘majutsushi/tagbar’
- tagbar的操作:
- o : 折叠与展开切换
- =:折叠所有标签
- *:展开所有标签
- Ctrl :回车跳到定义处(在文件的window中)
- p:跳到定义处,但是光标还在tagbar中
- Ctrl+N:跳到下一个标签的顶端
- Ctrl+P:跳到上一个标签的顶端(或者当前标签)
- .vimrc的配置
nmap <F8> :TagbarToggle<CR> " F8(有的笔记本是Fn+F8)打开关闭tagbar
let g:tagbar_ctags_bin = 'usr/bin/ctags' " tagbar依赖ctags(先安装)
let g:tagbar_autofocus = 1 "打开tagbar的时候,跳到tagbar的窗口,默认在文件窗口
autocmd BufReadPost *.cpp,*.c,*.h,*.hpp call tagbar#autoopen() "打开以下文件自动打开tagbar
"let g:tagbar_left = 1 让tagbar在页面左侧显示,默认右边
"let g:tagbar_width = 30 设置tagbar的宽度为30列,默认40
vim-autoformat
- 功能:格式化代码
- github地址
- 安装 :通过Vundle :Plugin ‘Chiel92/vim-autoformat’
- 使用
- 使用之前你得下载自动格式的工具:对于C C++可以使用clang-format(需要安装:sudo apt-get install clang-format)
- 在自己工程根目录下,建立.clang-format文件,在里面自定义格式(具体查看官网)
BasedOnStyle: LLVM
PointerAlignment: Left "指针在左边,如: int* p=NULL;
SpacesInParentheses : true " 小括号()两边添加空格
SpacesInSquareBrackets: false "中括号 []两边空格
AlignTrailingComments: true "注释对齐
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true
AfterFunction: true
AfterControlStatement: true
AfterEnum: true
AfterNamespace: true
AfterStruct: true
AfterUnion: true
BeforeCatch: true
BeforeElse: true
AccessModifierOffset: 0
IndentCaseLabels: true
IndentWidth: 4
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: true
AllowShortFunctionsOnASingleLine: true
ColumnLimit: 1000
AlignOperands: false
- .vimrc
noremap <F3> :Autoformat<CR> " 将F3映射为格式化
au BufWrite * :Autoformat " 保存的时候 格式化
let g:clang_format#auto_format=1 " 自动检测.clang-format作为配置的格式
NOTE:自己编写代码不太实用,灵活性不强,但是在阅读别人的源码,如果格式和你的习惯不一样,你可以用它来进行格式化。
clang-format -i main.cpp -style=file "将main.cpp 按照工程的根目录下你自定义.clang-format格式化
vim-copyright
- 功能:添加文件头
- 地址:github
- 安装:通过Vundle :
Plugin 'nine2/vim-copyright
- 使用说明(按照下面的.vimrc设置):
- 新建文件自动添加文件头
- 修改文件,跟新文件头的时间,文件名
- 打开已有的文件,添加文件头
- vimrc
"vim-copyright
let g:file_copyright_name = "julian Andrison"
let g:file_copyright_email = "15544925950@163.com"
let g:file_copyright_auto_filetypes = ['sh', 'plx', 'pl', 'pm', 'py', 'python', 'h', 'hpp', 'c', 'cpp', 'java'] "新建这些文件的时候会自动添加文件头
nnoremap <leader>a :CopyrightAdd<CR> "在现有的文件添加
nnoremap <leader>u :CopyrightUpdate<CR> "跟新现有的文件
DoxygenToolkit 函数注释
-
功能:生成函数的注释
-
地址:vim.org
-
安装:通过Vundle :
Plugin 'DoxygenToolkit.vim'
-
使用说明(按照下面的.vimrc设置):
-
vimrc
"DoxygenToolkit.vim
let g:DoxygenToolkit_briefTag_funcName = "yes"
let g:DoxygenToolkit_briefTag_pre = "@brief: "
let g:DoxygenToolkit_paramTag_pre="@param: "
let g:DoxygenToolkit_returnTag="@returns: "
nnoremap <leader>d :Dox<CR>