vim如果配置的好的话,不亚于一个牛逼的IDE,这篇文章介绍了vim的基本用法和一些好用的插件安装,包括补齐等插件,也是目前我写脚本用的最多的编辑器。
查看帮助:help
,Ctrl+]
进入标签,Ctrl+O
返回。
1.各种插入模式:
a → 在光标后插入
o → 在当前行后插入一个新行
O → 在当前行前插入一个新行
cw → 替换从光标所在位置后到一个单词结尾的字符
2.简单的移动光标:
0→ 数字零,到行头
^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
$ → 到本行行尾
g_ → 到本行最后一个不是blank字符的位置。
/pattern → 搜索 pattern 的字符串(如果搜索出多个匹配,可按n键到下一个)
3.拷贝/粘贴 (p/P都可以,p是表示在当前位置之后,P表示在当前位置之前):
P → 粘贴
yy → 拷贝当前行当行于 ddP
4.Undo/Redo
u → undo
Ctrl+r → redo
5.打开/保存/退出/改变文件(Buffer):
:e <path/to/file> → 打开一个文件
:w → 存盘
:saveas <path/to/file> → 另存为 <path/to/file>
:x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
:q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
:bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。
6.重复:
. → (小数点) 可以重复上一次的命令
N<command>→ 重复某个命令N次
7.光标移动:
NG → 到第 N 行 (注意命令中的G是大写的,一般使用 :N 到第N行,如 :137到第137行)
gg → 到第一行。(陈皓注:相当于1G,或 :1)
G → 到最后一行。
按单词移动:
w → 到下一个单词的开头。
e → 到下一个单词的结尾。
% : 匹配括号移动,包括 (, {, [. (陈皓注:你需要把光标先移到括号上)
* 和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)
1.复制外部文件时禁止自动缩进
:set paste #禁止自动缩进
:set nopaste #恢复
2.替换。:s(substitute)命令用来查找和替换字符串。
:{作用范围}s/{目标}/{替换}/{替换标志}
例如:%s/foo/bar/g会在全局范围(%)查找foo并替换为bar,所有出现都会被替换(g)
通过Vundle[1]进行插件管理,安装命令:
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
然后在.vimrc
中加入配置语句:
set nocompatible " required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin'gmarik/Vundle.vim'
" add plugin here
call vundle#end() " required
filetype plugin indent on " required
然后进入vim中并运行:PluginInstall
即可,以后只需要在添加一行Plugin 'xxx'并运行:PluginInstall
即可自动安装插件。
卸载插件只需将插件注释然后在vim中执行:PluginClean
NERDTree的插件可显示出类似于IDE中的目录树,有了目录树可以更清晰地查看项目的结构。
在安装.vimrc
中加入Plugin 'scrooloose/nerdtree'
,执行PluginInstall,插件就可以安装完成。然后在.vimrc
中加入:
" NERDTree config
" map <F2> to NERDTree
map <F2> :NERDTreeToggle<CR>
autocmd StdinReadPre* let s:std_in=1
autocmd VimEnter* if argc() == 0&& !exists("s:std_in") | NERDTree| endif
letNERDTreeWinSize= 15
letNERDTreeShowLineNumbers= 1
letNERDTreeAutoCenter= 1
letNERDTreeShowBookmarks= 1
主要功能为设置自动打开NERDTree,并设置快捷键F2
来自由切换打开或者关闭NERDTree。
一般NERDTree会把界面分成左右两个窗格,那么在窗格之间跳转我们可以使用Ctrl+W
两次即可跳转,当桌面窗口很多时,在vim中我们可以横向纵向打开多个窗格,那我们也可以通过Ctrl+W
后按Ctrl+h/j/k/l
来执行左/下/上/右的跳转。在每个窗格,我们都可以输入:q
或者:wq
关闭该窗格。
快捷键 | 描述 |
o | 打开文件,目录或者书签,和我们在对应节点上按回车键一个效果 |
go | 打开文件,但是光标仍然停留在目录中 |
t | 在新的tab上打开选定的节点 |
T | 与t相同,但是光标仍然停留在目录中 |
i | 在新窗格中打开文件 |
gi | 和i 相同,但是光标仍然停留在目录中 |
s | 在水平窗格打开一个文件 |
gs | 和s相同,但是光标仍然停留在目录中 |
A | 放大NERDTree窗口 |
p | 跳到根节点 |
P | 跳转到当前节点的父节点 |
K | 跳转到当前目录的第一个节点 |
J | 跳转到当前目录的最后一个节点 |
u | 把上层目录设置为根节点 |
C+C | 设置当前节点为root节点 |
ctrl+p | 模糊搜索文件 |
g+T | 切换到前一个tab |
g+t | 切换到后一个tab |
m | 显示文件系统菜单(添加、删除、移动操作) |
r: | 刷新光标所在的目录 |
R: | 刷新当前根路径 |
YouCompleteMe是自动补齐插件,支持c、c++、obj-c、c#、python等语言的自动补齐。
安装:不同于以往其他vim插件,YCM是一款编译型的插件。在下载完后,需要手动编译后才能使用。
安装依赖软件:
sudo apt-get install build-essential cmake python-dev python3-dev
首先在.vimrc
中加入以下代码:
Plugin'Valloric/YouCompleteMe'
保存退出后打开vim,在正常模式下输入:PluginInstall
,等待vundle将YouCompleteMe安装完成,需要等比较久的时间。而后进行编译安装:
cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer
上面是编译只有 C语言 的自动补全,如果想要所有的自动补全,可以使用 --all 参数:
cd ~/.vim/bundle/YouCompleteMe
./install.sh --all //或者 ./install.py --all
安装结束后,打开vim,如果没有提示YCM未编译,则说明安装已经成功了。
手动安装:
git clone --recursive https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
cd ~/.vim/bundle/YouCompleteMe
git submodule update --init --recursive
cd ~/.vim/plugin/YouCompleteMe
sudo apt-get install mono-xbuild
sudo apt-get install cmake
./install.py --clang-completer ##./install.py --all
编译完成后,还需要做一些配置工作,把~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py
这个文件复制到~/.vim
目录下面
cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim
在.vimrc
配置文件中还需要添加如下配置:
" YouCompleteMe {{{
"youcompleteme 默认tab s-tab 和自动补全冲突
"let g:ycm_key_list_select_completion=['<c-n>']
let g:ycm_key_list_select_completion = ['<tab>','<Down>']
"let g:ycm_key_list_previous_completion=['<c-p>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_complete_in_comments = 1"compelte comment also
let g:ycm_complete_in_strings = 1"complete string
let g:ycm_use_ultisnips_completer = 1"hint for UltiSnips
let g:ycm_collect_identifiers_from_comments_and_strings = 1"the char in comment and strings will also add to sets
let g:ycm_collect_identifiers_from_tags_files = 1
" identifier auto suggestion
let g:ycm_seed_identifiers_with_syntax=1
" 跳转到定义处, 分屏打开
let g:ycm_goto_buffer_command = 'horizontal-split'
" nnoremap <leader>jd :YcmCompleter GoToDefinition<CR>
nnoremap <leader>jd :YcmCompleterGoToDefinitionElseDeclaration<CR>
nnoremap <leader>gd :YcmCompleterGoToDeclaration<CR>
" 引入,可以补全系统,以及python的第三方包 针对新老版本YCM做了兼容
" old version
if!empty(glob("~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py"))
let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py"
endif
" new version
if!empty(glob("~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"))
let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"
endif
" 直接触发自动补全 insert模式下
" let g:ycm_key_invoke_completion = '<C-Space>'
" 黑名单,不启用
let g:ycm_filetype_blacklist = {
\ 'tagbar': 1,
\ 'gitcommit': 1,
\}
let g:ycm_server_python_interpreter = '/usr/bin/python'
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
" }}}
ctags是vim中的一款插件,它可以使用户在存在调用关系的函数间来回跳转,多用于查看源代码中的函数、变量或者宏。
安装ctags
:
sudo apt-get install ctags
要想使用该插件,先在要阅读的源码跟路径下手工生成索引文件:
ctags -R .
然后再在vim中加载tag:
:set tags=tags
或在.vimrc
中加入配置:
set tags=tags;
set autochdir
使用方法:
快捷键 | 用法 |
Ctrl + ] | 跳转到光标处的函数或者变量的定义所在的地方。 |
Ctrl + T | 返回到跳转之前的地方。 |
自动索引插件,在旧版本中的vim中是不支持异步模式的,因此每次写一部分代码需要手动运行ctags命令来生成索引,这是vim的一大痛点。vim8以后的版本,插件vim-gutentags
可以异步生成tags索引的插件。
安装,在.vimrc中加入:
Plugin'ludovicchabant/vim-gutentags'
配置:
" gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归 "
let g:gutentags_project_root = ['.root', '.svn', '.git', '.project']
" 配置 ctags 的参数 "
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+pxI']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
上面的ctags是查看函数或变量定义,想查看函数或变量调用的情况则需要使用cscope
。
安装:
sudo apt-get install cscope
在使用前需要对源代码生成索引库:
cscope -Rbq
上述命令会生成三个文件:cscope.cout
、cscope.in.out
以及cscope.po.out
。其中cscope.out
是基本符合的索引,后面两个文件是使用-q
选项生成的,用于加快一个cscope
索引的速度。
在vim中使用该插件也比较简单,首先调用cscope add
添加一个cscope
数据库,然后调用cscope find
命令进行查找。vim支持8种cscope的查询功能:
•s:查抄c语言符号,即查找函数名、宏、枚举值等出现的地方。•g:查找函数、宏、枚举等定义的位置,类似ctags提供的功能。•d:查找本函数调用的函数。•c:查找调用本函数的函数。•t:查找指定的字符串。•e:查找egrep模式,相当于egrep功能,但查找速度较快。•f:查找并打开文件,类似于vim的find功能。•i:查找包含本文件的文件。
为了方便使用,可以在.vimrc
中添加快捷键:
•F5 查找c语言符号符号•F6 查找字符串•F7 查找函数被谁调用•F8 查找函数调用了谁
"""
"scope
"建立数据库:cscope -Rbq
"F5 查找c符号
"F6 查找字符串
"F7 查找函数被谁调用
"F8 查找函数调用了谁
"""
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
"add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
:set cscopequickfix=s-,c-,d-,i-,t-,e-
"nmap <C-_>s : cs find s <C-R>=expand("<cword>")<CR><CR>
"F5 查找c符号 F6 查找字符串 F7 查找函数被谁调用 F8 查找函数调用了谁
nmap <silent><F5> :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <silent><F6> :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <silent><F7> :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <silent><F8> :cs find d <C-R>=expand("<cword>")<CR><CR>
TagBar
插件可以把源文件生成一个大纲,包括类、方法、变量以及函数名,可以选中并快速跳转到目标位置。
安装:先安装ctags
sudo apt-get install ctags
在.vimrc中加入
Plugin'majutsushi/tagbar'
配置,在.vimrc中加入:
" Tagbar
let g:tagbar_width=25
"let g:tagbar_autofocus=1
"let g:tagbar_left = 1
nmap <F3> :TagbarToggle<CR>
autocmd BufReadPost*.cpp,*.c,*.h,*.cc,*.cxx,*.py call tagbar#autoopen()
这样通过按F3就可以调出TagBar的窗格,同时在打开常见的源代码文件时会自动打开TagBar
插件。
ALE
(Asynchronization Lint Engine)是一款实时代码检测工具,可以在编写代码的过程中检测出语法错误,不用等到编译或者运行。
在.vimrc中加入
Plugin'w0rp/ale'
配置,在.vimrc中加入:
" ale
let g:ale_sign_column_always = 1
"自定义error和warning图标
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚡'
"在vim自带的状态栏中整合ale
let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK']
let g:ale_echo_msg_format = '[%linter%] %s %code: %%s'
let g:ale_lint_on_text_changed = 'normal'
let g:ale_lint_on_insert_leave = 1
let g:ale_c_gcc_options = '-Wall -O2 -std=c99'
let g:ale_cpp_gcc_options = '-Wall -O2 -std=c++14'
let g:ale_c_cppcheck_options = ''
let g:ale_cpp_cppcheck_options = ''
这个插件就是给括号自动配对的.
Plugin'jiangmiao/auto-pairs'
安装:
Plugin'scrooloose/nerdcommenter'
配置:
let g:NERDSpaceDelims=1" 注释后面自动加空格"
let g:mapleader=",""配置<leader>
使用:
<leader>cc 加注释
<leader>cu 解开注释
<leader>c<space> 加上/解开注释, 智能判断
<leader>cy 先复制, 再注解(p可以进行黏贴)
n<leader>cc 光标以下count行添加注释
n<leader>cu 光标以下count行取消注释
最后的配置文件vimrc[2]链接。
简明 VIM 练级攻略[3]
[1]
Vundle: https://github.com/gmarik/vundle#about[2]
vimrc: https://github.com/ray-cp/Tool_Script/blob/master/pwn_env_install/vimrc[3]
简明 VIM 练级攻略: https://coolshell.cn/articles/5426.html
往期推荐