vim命令备忘
Posted zeroisbug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vim命令备忘相关的知识,希望对你有一定的参考价值。
Vim
一般模式:
1.移动与跳转
0 光标移到行首
$ 光标移到行尾
G 光标跳到最后一行
1G 光标跳到第一行
gg = 1G
nG 光标跳到第n行
n+Enter 光标向下移动n行
2.查找与替换
/word 向下查找word
?word 向上查找word
n 英文小写字母n,用在在查找时,表示重复上一个查找的操作,光标跳到下一个匹配到的目标上
N 英文大写字幕N,同上,跳到上一个匹配到的目标上
:n1,n2s/word1/word2/g n1,n2是数字,在n1到n2行之间查找word1,并且替换为word2
:n1,n2 -> search word1 -> word2 go
:1,$s/word1/word2/g 从第一行到最后一行查找word1,并且用word2替换
:1,$s/word1/word2/gc 从第一行到最后一行查找word1,并且用word2依次替换,并且在替换前确认
:1,$ -> search word1 -> word2 go confirm
3.删除,复制和粘贴
x 向后删除一个字符,我理解的是删除光标包裹的那个字符
X 向前删除一个字符,光标包裹的前一个字符
nx n为数字,向后删除n个字符,即删除从光标包裹开始的n个字符
dd 删除光标所在的那一行
ndd 删除,从光标开始向下的n行
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d0 删除光标点到光标这一行第一个字符的所有数据
d$ 删除光标点到光标这一行最后一个字符的所有数据
注意:
光标一般指的是,被光标包裹的字符,前面的那个缝隙
所以,d0 删除的时候不会删除光标包裹的字符,而 d$ 删除时会删除光标包裹的那个字符
字符在跳转,选择,删除,粘贴时候都遵循这个,del 和 backspace 亦是
yy 复制光标所在那一行
nyy 复制从光标所在那一行开始的向下n行
y1G 复制光标所在行到第一行所有数据
yG 复制光标所在行到最后一行的所有数据
y0 复制光标所在位置到该行行首的所有数据(不包括光标包裹的字符)
y$ 复制光标所在位置到该行行尾的所有数据(包括光标包裹的字符)
p 粘贴数据
若是按照行复制的(yy,nyy),则在光标的下一行粘贴
若是按照字符个数复制(y0,y$),则是从光标所在的位置开始粘贴
P 粘贴,向上或者向前粘贴,规则同上
c 删除多行数据
u 撤销上一个操作
Ctrl+r 重复上一个操作
二.一般模式:
i insert,光标所在处插入
I 光标所在行的第一个非空格出开始插入,即在光标移动到第一个可见字符前面
o insert,在光标所在下一行新开一行,开始插入
O 向上新开一行,开始插入
a add,在光标所在的下一个字符开始添加
A 在行尾开始添加
r replace,从光标处开始替换,只会替换一次
R 一直替换
三.命令模式:
:set nu 显示行号
:set nonu 关闭显示行号
:w [filename] 另存为
:r [filename] 读入文件,添加到光标所在行的后面
:n1,n2 w [filename] 将n1行到n2行的内容保存到filename里面
:!command 临时切换到外面执行命令
:ZZ 两个大写的Z,若文件没有更动则退出,有更动则保存后退出
插件的使用:
一、安装vim和vim的基本插件
命令:sudo apt-get install vim vim-scripts vim-doc
vim-scripts是vim的基本插件,语法高亮,缩进等等
vim-doc是vim帮助文档
二、基本配置
1.在个人目录下新建一个.vimrc的vim配置文件,并粘贴以下内容保存,如果用vim复制粘贴不方便,可以用gedit
配置文件如下:
" This line should not be removed as it ensures that various options are
" properly set to work with the Vim-related packages available in Debian. 下面这句如果在ubuntu下要注释掉
" debian.vim
" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets ‘nocompatible‘. Setting ‘compatible‘ changes numerous
" options, so any other options should be set AFTER setting ‘compatible‘.
set nocompatible
" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 语法高亮
endif
colorscheme ron " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下
" detect file type
filetype on
filetype plugin on
" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark
" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("‘\"") > 1 && line("‘\"") <= line("$") | exe "normal! g‘\"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif
" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
"set ignorecase " 搜索模式里忽略大小写
"set smartcase " 如果搜索模式包含大写字符,不使用 ‘ignorecase‘ 选项。只有在输入搜索模式并且打开 ‘ignorecase‘ 选项时才会使用。
set autowrite " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、‘{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
set autoindent " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
"set smartindent " 智能对齐方式
set tabstop=4 " 设置制表符(tab键)的宽度
set softtabstop=4 " 设置软制表符的宽度
set shiftwidth=4 " (自动) 缩进使用的4个空格
set cindent " 使用 C/C++ 语言的自动缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "设置C/C++语言的具体缩进方式
"set backspace=2 " 设置退格键可用
set showmatch " 设置匹配模式,显示匹配的括号
set linebreak " 整词换行
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用鼠标
set number " Enable line number "显示行号
"set previewwindow " 标识预览窗口
set history=50 " set command history to 50 "历史记录50条
"--状态行设置--
set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
set ruler " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
"--命令行设置--
set showcmd " 命令行显示输入的命令
set showmode " 命令行显示vim当前模式
"--find setting--
set incsearch " 输入字符串就显示匹配点
set hlsearch
set clipboard=unnamed " 允许vim与系统剪切板交互,当在系统复制了一段代码,允许直接在vim用p命令粘贴
注意英语的双引号加空格表示后面的是注释
2、管理vim插件工具 vim-addon-manager
一般在安装了vim、vim-scripts和vim-doc之后就会安装好,如果没安装,可以用
命令:sudo apt-get install vim-addon-manager
进行安装
如果要查看vim各个插件的状态,可以用
命令:vim-addons status
查看
此外,我们可以利用vim-addon-manager安装官方插件,这里我们先要确定在个人目录下是否有~/.vim/plugin和~/.vim/doc两个目录,如果没有,自己分别新建好,当我们要安装xxx插件时,我们可以用
命令:vim-addons install xxx
进行安装
对于vim-addons的详细用法,可以用
命令:man vim-addons
查看帮助文档
3、安装ctags
ctags用于建立源代码树的标签索引,用于快速定位函数,宏定义,变量等
新安装的ubuntu没有ctags,可以用
命令:sudo apt-get install ctags
并在.vimrc文件中添加配置,实现按下F5更新工程中的tags文件
配置文件:
" *********************** ctags setting ***********************************
"
" 按下F5重新生成tag文件,并更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "add current directory‘s generated tags file
" set tags+=/usr/include/systags "add new tags file(增加其他路径下的tags,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
要实现其他路径的代码索引,必须生成代码的tags的文件,例如要生成标准库的tags文件,步骤为cd到目录/usr/include,然后用
命令:sudo ctags -R --c++-kinds=+p --fields=+iaS --extra=+q *
建立该目录以及子目录的索引,其中 * 表示建立该目录及其子目录的索引
然后我们会发现该目录下多了一个tags文件,并重命名为systags
为了省去每次建立工程时添加tags文件,可以在.vimrc文件中添加配置命令(上述配置中已经添加)
set tags+=/usr/include/systags
这样每次建立工程的时候就会自动添加该路径下的tags文件
要注意的是,这个tags文件不能随便移动,我试过将这个文件移动到其他地方,发现/usr/include子目录下的文件会找不到
当我们要查看某个函数的原型时,将光标停留在函数名上,用快捷键ctrl+w+],就能在vim中增加一个新窗口,并定位到函数的原型上,如果用快捷键ctrl+],则会在原来的窗口上进行定位,用快捷键ctrl+o,则会返回到原来的代码编辑位置
4、vim自动补全——OmniCppComplete
用vim-addons安装该插件
命令:vim-addons install omnicppcomplete
然后在.vimrc中添加如下配置,设置插件的补全功能
配置文件:
" 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don‘t insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1
由于该插件的补全功能基于ctags的数据,所以用ctags生成索引的时候要添加额外的参数
命令:ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
其中,--c++-kinds=+p : 为C++文件增加函数原型的标签
--fields=+iaS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、以及函数的指纹(S)
--extra=+q : 为标签增加类修饰符。注意,如果没有此选项,将不能对类成员补全
在编写代码时,假如我们要敲printf,此时只要敲prin,然后用快捷键ctrl+x ctrl+o,就能呼出候选函数
此外,还有常用的快捷键
当自动补全下拉窗口弹出后,一些可用的快捷键:
Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项
其他补全方式:
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+K 根据字典补全
Ctrl+X Ctrl+T 根据同义词字典补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议
帮助文档
:help omnicppcomplete
5、提示函数原型echofunc
echofunc可以在命令行中提示当前输入函数的原型。
echofunc下载地址:http://www.vim.org/scripts/script.php?script_id=1735
下载完成后,把echofunc.vim文件放到 ~/.vim/plugin文件夹中
当你在vim插入(insert)模式下紧接着函数名后输入一个"("的时候, 这个函数的声明就会自动显示在命令行中。如果这个函数有多个声明, 则可以通过按键"Alt+-"和"Alt+="向前和向后翻页, 这个两个键可以通过设置g:EchoFuncKeyNext和g:EchoFuncKeyPrev参数来修改。这个插件需要tags文件的支持, 并且在创建tags文件的时候要加选项"--fields=+lS"(OmniCppComplete创建的tag文件也能用),
整个创建tags文件的命令如下:
命令:ctags -R --fields=+lS
7、标签浏览器Taglist
Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)
正常来说,按照上述步骤操作,Taglist已经安装到vim中了,如果还没安装,可以用
命令:vim-addons install taglist
进行安装
如果出现:Info: ignoring ‘taglist‘ which is neither removed nor broken 的错误,有可能是因为taglist已经安装好了,打开vim,在命令模式下输入
命令:Tlist
如果出现标签栏说明已经安装好了,此外还可以使用
此外,还要在.vimrc里对Taglist进行配置
配置文件:
let Tlist_Ctags_Cmd=‘ctags‘ "因为我们放在环境变量里,所以可以直接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
"是否一直处理tags.1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
let Tlist_Inc_Winwidth=0
命令::help taglist.txt 查看帮助文档
7、文件浏览器和缓冲区管理器WinManager
WinManager用于管理文件浏览器和缓冲区(buffer)。2.0以上版本的WinManager还可以管理其他IDE类型插件,不过要用户在插件中增加一些辅助变量和hook来支持WinManager(帮助文档有相关说明)。
Taglist插件本身就提供了对WinManager的支持,不需要我们去修改它。这里,我们就用WinManager来管理文件浏览器netrw和标签浏览器Taglist。netrw是标准的vim插件, 已经随vim一起安装进系统里了, 不需要我们自行下载安装。
安装WinManager,可以用
命令:vim-addons install winmanager
配置winmanager可以在.vimrc里面添加配置
配置文件:
"-- WinManager setting --
let g:winManagerWindowLayout=‘FileExplorer|TagList‘ " 设置我们要管理的插件
"let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
nmap wm :WMToggle<cr>
常用命令
:WMToggle 打开/关闭WinManage,不过我们在配置文件.vimrc中做了快捷键映射,所以直接按wm就可以打开/关闭WinManage
文件浏览器命令(在文件浏览器窗口中使用)
<enter>或双击 如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
<tab> 如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
<F5> 刷新列表
- 返回上一层目录
c 使浏览目录成为vim当前工作目录
d 创建目录
D 删除当前光标下的目录或文件
i 切换显示方式
R 文件或目录重命名
s 选择排序方式
r 反向排序列表
x 定制浏览方式, 使用你指定的程序打开该文件
winmanager帮助文档
:help winmanager
netrw帮助文档
:help netrw
8、buffer管理器MiniBufferExplorer
MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕上。vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.
关于vim缓冲区(buffer)和窗口的概念(详见:help windows)
"缓冲区" 是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。
"窗口" 被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。
"屏幕" Vim 所用的整个工作区域,可以是一个终端模拟窗口,也被叫做 "Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
安装该插件可以用(按照上面的步骤下来应该已经装好了,或者vim已经自带了)
命令:vim-addons install minibufexplorer
并在.vimrc中添加配置
配置文件:
" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持
"let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持
let g:miniBufExplModSelTarget = 1 " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer
常用命令
<Tab> 移到上一个buffer
<Shift-Tab> 移到下一个buffer
<Enter> 打开光标所在的buffer
d 删除光标所在的buffer
9、代码折叠fold
折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。就像一张纸,要它缩短
些,可以把它折叠起来。
那些文本仍然在缓冲区内而没有改变。受到折叠影响的只是文本行显示的方式。
折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,会使你更好地了解对文本
的宏观结构。
折叠方式foldmethod
vim提供以下6种方法来选定折叠方式:
manual 手工定义折叠
indent 更多的缩进表示更高级别的折叠
expr 用表达式来定义折叠
syntax 用语法高亮来定义折叠
diff 对没有更改的文本进行折叠
marker 对文中的标志折叠
折叠级别foldlevel
‘foldlevel‘ 是个数值选项:数字越大则打开的折叠更多。
当 ‘foldlevel‘ 为 0 时,所有的折叠关闭。
当 ‘foldlevel‘ 为正数时,一些折叠关闭。
当 ‘foldlevel‘ 很大时,所有的折叠打开。
折叠栏foldcolumn
‘foldcolumn‘ 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
一个打开的折叠由一栏来表示,顶端是 ‘-‘,其下方是 ‘|‘。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
一个关闭的折叠由 ‘+‘ 表示。
当折叠栏太窄而不能显示所有折叠时,显示一数字来表示嵌套的级别。
在折叠栏点击鼠标,可以打开和关闭折叠:
- 点击 ‘+‘ 打开在这行的关闭折叠
- 在任何其他非空字符上点击,关闭这行上的打开折叠
在vim配置文件/home/user/.vimrc中加入如下的配置:
set foldmethod=syntax " 用语法高亮来定义折叠
set foldlevel=100 " 启动vim时不要自动折叠代码
set foldcolumn=5 " 设置折叠栏宽度
常用命令
za 打开/关闭在光标下的折叠
zA 循环地打开/关闭光标下的折叠
zo 打开 (open) 在光标下的折叠
zO 循环打开 (Open) 光标下的折叠
zc 关闭 (close) 在光标下的折叠
zC 循环关闭 (Close) 在光标下的所有折叠
zM 关闭所有折叠
zR 打开所有的折叠
帮助文档
:help usr_28.txt
:help fold.txt
10、项目数据管理器Project
(其实我还不知道这东西拿来干嘛的,应该是我还没搞过大的工程,所以用不到) Project插件是用来显示项目的目录树的,这个目录树是默认保存在~/.vimprojects文件中。
安装Project
命令:vim-addons install project
Project目录树可以通过下面的步骤生成:
1) 打开vim在命令模式下输入 :Project,在屏幕的最左边就会出现一个project框。不过因为没有初始化暂时是空的
2)在命令模式下(不是插入模式)输入\C (大写的C),会出现下面这些信息:
Enter the Name of the Entry: xxxx (输入项目名称)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (输入项目根目录的绝对路径)
Enter the CD parameter: . (“.”为当前目录)或者和项目根目录一致
Enter the File Filter: *.* (符合条件的源文件,可以是*.cpp/*.h等)
PS:项目目录可以嵌套。而且更改之后在~/.vimprojects文件中就能看到内容,你可以手动进行更改。
Project目录树可以通过下面的步骤生成:
1) 打开vim在命令模式下输入 :Project,在屏幕的最左边就会出现一个project框。不过因为没有初始化暂时是空的
2)在命令模式下(不是插入模式)输入\C (大写的C),会出现下面这些信息:
Enter the Name of the Entry: xxxx (输入项目名称)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (输入项目根目录的绝对路径)
Enter the CD parameter: . (“.”为当前目录)或者和项目根目录一致
Enter the File Filter: *.* (符合条件的源文件,可以是*.cpp/*.h等)
PS:项目目录可以嵌套。而且更改之后在~/.vimprojects文件中就能看到内容,你可以手动进行更改。
11、quickfix命令集
通过quickfix命令集,你可在 Vim 内编译程序并直接跳转到出错位置进行修正。你可以接着重新编译并做修正,直到不再出错为止。
在vim配置文件/home/user/.vimrc中加入如下的配置:
" 按下F6,执行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7,执行make编译程序,并打开quickfix窗口,显示编译信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8,光标移到上一个错误所在的行
map <F8> :cp<CR>
" 按下F9,光标移到下一个错误所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷键在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>
帮助文档
:help usr_30
:help quickfix
下面的命令运行 "make" (包括你所给出的参数) 程序并捕捉其运行结果: >
:make {arguments}
如果编译时出现错误,按 <Enter>,回到vim界面,看不到出错信息了!这时,可以运行以下命令
:cw[indow]
打开quickfix窗口来查看出错信息,它会自动跳到第一处出错的地方。然后,你可以双击出错某一条出错信息,vim就会自动跳转到相应的出错位置
:cn[ext] 光标移到下一个错误所在的行
:cp[revious] 光标移到上一个错误所在的行
:cfirst 到第一处错误
:clast 到最后一处错误
:cc 空间不够时,Vim 会缩短出错信息。如果你想查看详细信息,可以使用此命令
:cl[ist] 列出所有出错信息的概览(只有那些含有文件名或行数的错误信息会被显示,需要查看那些并不含文件名或行数的信息可用“:cl[ist]!”命令)
12、cscope
Cscope是一个类似于ctags的工具,不过其功能比ctags强大很多。
安装Cscope
命令:sudo apt-get install cscope
在vim配置文件/home/user/.vimrc中加入如下的配置:
if has("cscope")
set csprg=/usr/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>
cscope的主要功能是通过其"find"子命令来实现的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s 查找这个 C 符号(可以跳过注释)
1 或 g 查找这个定义
2 或 d 查找这个函数调用的函数
3 或 c 查找调用过这个函数的函数
4 或 t 查找这个字符串
6 或 e 查找这个 egrep 模式
7 或 f 查找这个文件
8 或 i 查找包含这个文件的文件
用法:
<1>、为源码建立一个cscope数据库
[email protected]:~/arm/Linux-2.6.28.7$ cscope -Rbq
[email protected]:~/arm/linux-2.6.28.7$ ls cscope.*
cscope.in.out cscope.out cscope.po.out
<2>、用vim打开某个源码文件,末行模式下,输入“:cs add cscope.out"(该命令已被我们映射为快捷键F4),添加cscope数据库到vim。因为我们已将vim配置为启动时,自动添加当前目录下的cscope数据库,所以你再添加该cscope数据库时,vim会提示“重复cscope数据库 未被加入“
<3>、完成前两步后,现在就可以用“cs find c”等Cscope查找命令查找关键字了。我们已在.vimrc中将“cs find c”等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快按下c)
帮助文档
:help if_cscop
注意:帮助文档if_cscop中,快捷键映射nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>是有误的!
比如光标“header.h”上按下<C-_>i,也就是查找包含“header.h“的文件。但是按照这个映射规则,则是将<C-_>i映射为cs find i ^header.h$,也就是查找包含“^header.h$“的文件,这显然不是我们想要的结果。该映射规则应该改成nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR>
13、快捷键汇总
根据上面的配置 F2-F9 按键的功能为:
F2:根据头文件内关键字进行补全
F3:自动补全代码
F4:添加cscope数据库到vim
F5:更新当前目录下的tags文件
F6:执行make clean命令
F7:执行make命令
F8:编译错误时移动到上一个错误
F9:编译错误时移动到下一个错误
vim常用快捷键(一般模式下)
shift+v:视图模式
gg:光标移动到文档开头
G:光标移动到最后一行开头
shift+$:移动到该行的末尾
i:进入插入模式(光标前位置进行插入)
a:进入插入模式(光标后位置进行插入)
o:在光标下新建一行并进入插入模式
O:在光标上新建一行并进入插入模式
I:在该行行尾进入插入模式
A:在该行行首进入插入模式
y:复制到vim剪切板
p:从vim剪切板拷贝
"+y:复制到系统剪切板
"+p:从系统剪切板进行复制
u:撤销上一步操作
ctrl+r:恢复上一步撤销
j/k/h/l:光标上/下/左/右移动
dd:删除整行
以上是关于vim命令备忘的主要内容,如果未能解决你的问题,请参考以下文章