vim 笔记
2020-05-16 19:11:21 Author: mp.weixin.qq.com(查看原文) 阅读量:12 收藏

               


vim如果配置的好的话,不亚于一个牛逼的IDE,这篇文章介绍了vim的基本用法和一些好用的插件安装,包括补齐等插件,也是目前我写脚本用的最多的编辑器。

基础使用

查看帮助:helpCtrl+]进入标签,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 → undoCtrl+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,或 :1G → 到最后一行。按单词移动:w → 到下一个单词的开头。e → 到下一个单词的结尾。
% : 匹配括号移动,包括 (, {, [. (陈皓注:你需要把光标先移到括号上)* 和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

进阶命令

1.复制外部文件时禁止自动缩进

:set paste #禁止自动缩进:set nopaste #恢复

2.替换。:s(substitute)命令用来查找和替换字符串。

:{作用范围}s/{目标}/{替换}/{替换标志}例如:%s/foo/bar/g会在全局范围(%)查找foo并替换为bar,所有出现都会被替换(g)

插件

Vundle

通过Vundle[1]进行插件管理,安装命令:

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然后在.vimrc中加入配置语句:

set nocompatible              " requiredfiletype off                  " requiredset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()Plugin'gmarik/Vundle.vim'" add plugin herecall vundle#end()            " requiredfiletype plugin indent on    " required

然后进入vim中并运行:PluginInstall即可,以后只需要在添加一行Plugin 'xxx'并运行:PluginInstall即可自动安装插件。

卸载插件只需将插件注释然后在vim中执行:PluginClean

NERDTree

NERDTree的插件可显示出类似于IDE中的目录树,有了目录树可以更清晰地查看项目的结构。

在安装.vimrc中加入Plugin 'scrooloose/nerdtree',执行PluginInstall,插件就可以安装完成。然后在.vimrc中加入:

" NERDTree config" map <F2> to NERDTreemap <F2> :NERDTreeToggle<CR>autocmd StdinReadPre* let s:std_in=1autocmd VimEnter* if argc() == 0&& !exists("s:std_in") | NERDTree| endifletNERDTreeWinSize= 15letNERDTreeShowLineNumbers= 1letNERDTreeAutoCenter= 1letNERDTreeShowBookmarks= 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

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/YouCompleteMecd ~/.vim/bundle/YouCompleteMegit submodule update --init --recursivecd ~/.vim/plugin/YouCompleteMesudo apt-get install mono-xbuildsudo 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 alsolet g:ycm_complete_in_strings = 1"complete stringlet g:ycm_use_ultisnips_completer = 1"hint for UltiSnipslet g:ycm_collect_identifiers_from_comments_and_strings = 1"the char in comment and strings will also add to setslet g:ycm_collect_identifiers_from_tags_files = 1" identifier auto suggestionlet 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 versionif!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 versionif!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'" }}}

ctages

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-gutentags

自动索引插件,在旧版本中的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']

cscope

上面的ctags是查看函数或变量定义,想查看函数或变量调用的情况则需要使用cscope

安装:

sudo apt-get install cscope

在使用前需要对源代码生成索引库:

cscope -Rbq

上述命令会生成三个文件:cscope.coutcscope.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/cscopeset csto=1set cstset nocsverb"add any database in current directoryif filereadable("cscope.out") cs add cscope.out endifset csverbendif
: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

TagBar插件可以把源文件生成一个大纲,包括类、方法、变量以及函数名,可以选中并快速跳转到目标位置。

安装:先安装ctags

sudo apt-get install ctags

在.vimrc中加入

Plugin'majutsushi/tagbar'

配置,在.vimrc中加入:

" Tagbarlet g:tagbar_width=25"let g:tagbar_autofocus=1"let g:tagbar_left = 1nmap <F3> :TagbarToggle<CR>autocmd BufReadPost*.cpp,*.c,*.h,*.cc,*.cxx,*.py call tagbar#autoopen()

这样通过按F3就可以调出TagBar的窗格,同时在打开常见的源代码文件时会自动打开TagBar插件。

ALE

ALE (Asynchronization Lint Engine)是一款实时代码检测工具,可以在编写代码的过程中检测出语法错误,不用等到编译或者运行。

在.vimrc中加入

Plugin'w0rp/ale'

配置,在.vimrc中加入:

" alelet g:ale_sign_column_always = 1"自定义error和warning图标let g:ale_sign_error = '✗'let g:ale_sign_warning = '⚡'"在vim自带的状态栏中整合alelet 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 = 1let 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 = ''

auto-pairs

这个插件就是给括号自动配对的.

Plugin'jiangmiao/auto-pairs'

nerdcommenter

安装:

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]

References

[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

往期推荐

CVE-2017-17562 GoAhead远程代码执行漏洞分析

linux内核提权系列教程(3):栈变量未初始化漏洞

D-Link service.cgi远程命令执行漏洞分析

linux内核提权系列教程(1):堆喷射函数sendmsg与msgsend利用


文章来源: http://mp.weixin.qq.com/s?__biz=MzI2ODM4NzUyNQ==&mid=2247484132&idx=1&sn=e0819bb33ea682b13f78e58aacd7592d&chksm=eaf1174edd869e587f96058c491e6aa473dc1bd9e3a8e481f14a784e3de1927b0a7d79b76c58&mpshare=1&scene=24&srcid=&sharer_sharetime=1589627480706&sharer_shareid=5191b3dcb328f693d5261ba6bca8d267#rd
如有侵权请联系:admin#unsafe.sh