一、VIM 命令
@1:模式切换:
1、i, I 进入插入模式(Insert mode):i 为从目前光标所在处插入, I 为在目前所在行的第一个非空格符处开始插入。 (常用)
2、a, A 进入插入模式(Insert mode):a 为从目前光标所在的下一个字符处开始插入, A 为从光标所在行的最后一个字符处开始插入。(常用)
3、o, O 进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为在目前光标所在的下一行处插入新的一行; O 为在目前光标所在处的上一行插入新的一行!(常用)
4、r, R 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R 会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
5、[Esc] 退出编辑模式,回到一般模式中(常用)
@2:基本操作:
1、h和向左箭头键(←) 光标向左移动一个字符
2、j和向下箭头键(↓) 光标向下移动一个字符
3、k和向上箭头键(↑) 光标向上移动一个字符
4、l和向右箭头键(→) 光标向右移动一个字符
5、Ctrl] + f 屏幕向下移动一页,相当于Page Down按键 (常用)
6、Ctrl] + b 屏幕向上移动一页,相当于 Page Up按键 (常用)
7、n<space> n 表示数字,例如 20。按下数字后再按空格键,光标会向右移动这一行的n 个字符。如 20<space> 则光标会向后面移动20 个字符距离。(常用)
8、0 数字 0 :移动到这一行的最前面字符处 (常用)
9、$ 移动到这一行的最后面字符处(常用)
10、G 移动到这个档案的最后一行(常用)
11、nG n为数字。移动到这个档案的第 n 行(常用)
12、gg 移动到这个档案的第一行,相当于1G(常用)
13、n<Enter> n 为数字。光标从当前位置向下移动 n 行(常用)
14、特别注意,在 vim中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。距离来说,要删除 50 行,则是用 50dd对吧! 数字加在动作之前~那我要向下移动20 行呢?那就是20j或者是20↓即可
@3:搜寻:
1、/word (需要按下enter健)向光标下寻找一个名称为 word的字符串。例如要在档案内搜寻vbird 这个字符串,就输入 /vbird 即可! (常用)
2、?word 向光标上寻找一个字符串名称为 word 的字符串
3、n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
4、N 这个 N 是英文按键。不 n 刚好相反,为反向进行向前一个搜寻动作。 例如 /vbird 后,按下 N 则表示向上搜寻 vbird 。
5、:n1,n2s/word1/word2/g n1和n2 为数字。在第 n1 到n2 行之间寻找 word1 这个字符串,并将该字符串叏代为 word2 !
举例来说,在 100 到 200 行间搜寻vbird 并叏代为 VBIRD 则:100,200s/vbird/VBIRD/g。(常用)
6、:1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串替换为word2 !(常用)
7、:1,$s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
@4、删除复制:
1、x, X 在一行字当中,x 为向后删除一个字符 (相当亍 [del] 按键), X 为向前删除一个字符(相当亍 [backspace] 亦即是退格键) (常用)
2、nx n 为数字,连续向后删除n个字符。举例来说,我要连续删除 10 个字符, 『10x』。(常用)
3、dd 删除游标所在的那一整列(常用)
4、ndd n 为数字。删除光标所在的向下n列,例如20dd 则是删除20列 (常用)
5、yy 复制游标所在的那一行(常用)
6、nyy n 为数字。复制光标所在的向下n列,例如 20yy 则是复制 20 列(常用)
7、p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!举例来说,我目前光标在第 20 行,且已经复制了10 行数据。则按下 p 后,那 10 行数据会贴在原本的20 行后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第20行会被推到变成30行。 (常用)
@5:重复
1、u 复原前一个动作。(常用)
2、[Ctrl]+r 重做上一个动作一次(测试貌似没什么用)。(常用)
这个 u 和[Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
3、. 不要怀疑!这就是小数点!意思是重复前一个动作。如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)
@6:文件储存
1、:w 将编辑的数据写入硬盘档案中(常用)
2、:w! 若文件属性为只读时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!(常用)
3、:q 离开 vim (常用)
4、:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。注意一下啊,那个惊叹号 (!) 在 vim 当中,常常具有强制的意思(常用)
5、:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
6、:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)(常用)
@7:区块选择(Visual Block)
1、v 字符选择 会将光标经过的地方反白选择!
2、V 行选择 会将光标经过的行反白选择!
3、[Ctrl]+v 区块选择,可以用长方形的方式选择资料
4、y 将反白的地方复制起来
5、d 将反白的地方删除掉
@8:多档案编辑
假设一个例子,你想要将 hosts 内的 IP 复制到你的 /etc/hosts 这个档案去, 那么该如何编辑?我们知道在 vim 内可以使用 :r filename 来读入某个档案的内容,
不过,这样毕竟是将整个档案读入啊!如果我只是想要部分内容呢?呵呵!这个时候多档案同时编辑就很有用了。 我们可以使用vim 后面同时将几个档案来同时打开!
相关的按键有:
1、:n 编辑下一个档案
2、:N 编辑上一个档案
3、:files 列出目前这个 vim 的打开的所有档案
在过去,想要将 A 档案内的十条消息移动到 B 档案去,通常要开两个 vim 窗口来复制, 偏偏每个 vim 都是独立的,
因此并没有办法在 A 档案下达 nyy 再跑到 B 档案去 p !在这种情况下最常用的方法就是透过鼠标圈选,复制后贴上。
现在可以做一下练习看看说!假设你要将提 hosts 内的前四行 IP 资料复制到你的/etc/hosts 档案内,可以这样:
1. 、 vim hosts /etc/hosts 指令来使用一个 vim 打开两个档案;
2. 、在 vim 中先使用:files 查看一下编辑的档案数据有啥
3.、 在第一行输入 4yy 复制四行;
4. 、在 vim 的环境下输入 :n 会来到第二个编辑的档案,亦即 /etc/hosts 内;
5.、在 /etc/hosts 下按G 到最后一行,再输入 p 贴上;
6.、按下多次的 u 来还原原本的档案数据;
7、最终按下 :q 来离开 vim 的多档案编辑吧!
看到了吧?利用多档案编辑的功能,可以让你很快速的就将需要的资料复制到正确的档案内。 当然,这个功能也可以利用窗口接口来达到,
那就是底下要提到的多窗口功能。
@9:多窗口功能
在开始这个小节前,先来想象两个情况:
1、当我有一个档案非常的大,我查阅到后面的数据时,想要对照前面的数据, 是否需要使用ctrl+f 和ctrl+b 来跑前跑后查阅?
2、我有两个需要对照着看的档案,不想使用前一小节提到的多档案编辑功能??
在一般窗口接口下的编辑软件大多有分割窗口或者是冻结窗口的功能来将一个档案分割成多个窗口的展现, 那么 vim 能不能达到这个功能啊?
可以啊!但是如何分割窗口并放入档案呢? 很简单!在指令列模式输入:sp {filename}即可!那个 filename 可有可无, 如果想要在新窗口打开另
一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口!
1、:sp [filename] 开启一个新窗口,如果有加 filename, 表示在新窗口打开一个新档案,否则表示两个窗口为同一个档案内容(同步显示)。
2、[ctrl]+w+ j [ctrl]+w+↓
按键的按法是:先按下 ctrl不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。
[ctrl]+w+ k [ctrl]+w+↑
同上,不过光标移动到上面的窗口。
3、[ctrl]+w+ q
其实就是 :q 结束离开! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下ctrl+w+q 啊!
@10:重新vim编辑文件有时会出现六个可用按钮,各按钮的说明如下:
1、 [O]pen Read-Only:打开此档案成为只读档, 可以用在你只是想要查阅该档案内容并不想要进行编辑行为时。一般来说,在上课时,如果你是登入到同学的计算机去看
他的 配置文件, 结果収现其实同学他自己也在编辑时,可以使用这个模式;
2、 (E)dit anyway:还是用正常的方式打开你要编辑的那个档案, 并且会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的档案等问题!不好不好!
3、 (R)ecover:就是加载暂存盘的内容,用在你要救回以前未储存的工作。 不过当你救回来并且储存离开 vim 后,还是要手动自行删除那个暂存档喔!
4、(D)elete it:你确定那个暂存档是无用的!那么开启档案前会先将这个暂存盘删除! 这个动作其实是比较常做的!因为你可能不确定这个暂存档是怎么来的,
所以就删除掉他吧!哈哈!
5、(Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
6、(A)bort:忽略这个编辑行为,感觉上与 quit 非常类似! 也会送你回到命令提示字符就是啰!
二、cscope使用
Cscope 是一个交互式的屏幕下使用的工具,用来帮助你:
* 无须在厚厚的程序清单中翻来翻去就可以认识一个 C 程序的工作原理。
* 无须熟悉整个程序就可以知道清楚程序 bug 所要修改的代码位置。
* 检查提议的改动 (如添加一个枚举值) 可能会产生的效果。
* 验证所有的源文件都已经作了需要的修改;例如给某一个现存的函数添加一个参数。
* 在所有相关的源文件中对一个全局变量改名。
* 在所有相关的位置将一个常数改为一个预处理符号。
它被设计用来回答以下的问题:
* 什么地方用到了这个符号?
* 这是在什么地方定义的?
* 这个变量在哪里被赋值?
* 这个全局符号的定义在哪里?
* 这个函数在源文件中的哪个地方?
* 哪些函数调用了这个函数?
* 这个函数调用了哪些函数?
* 信息 "out of space" 从哪来?
* 这个源文件在整个目录结构中处于什么位置?
* 哪些文件包含这个头文件?
安装
yum install cscope
在/etc/vimrc中增加一句:
:set cscopequickfix=s-,c-,d-,i-,t-,e- |
这个是设定是否使用 quickfix 窗口来显示 cscope 结果, 用法在后面会说到
使用cscope
使用cscope前,必须为代码生成一个cscope数据库。再当前代码目录下,运行下列命令。
cscope –Rbq
然后会在当前目录生成3个文件:cscope.in.out,cscope.out,cscope.po.out
vim 会自己在/etc/vimrc里面增加,如果没有自己需要添加
47 if has("cscope") && filereadable("/usr/bin/cscope")
48 set csprg=/usr/bin/cscope
49 set csto=0
50 set cst
51 set nocsverb
52 " add any database in current directory
53 if filereadable("cscope.out")
54 cs add $PWD/cscope.out
55 " else add database pointed to by environment
56 elseif $CSCOPE_DB != ""
57 cs add $CSCOPE_DB
58 endif
59 set csverb
60 endif
那么我们在当前目录vim xx.c的时候,自然也就打开了这个工程。
scope的选项分析:
-R :表示包含此目录的子目录,而非仅仅是当前目录;
-b :此参数告诉cscope生成数据库后就自动退出;
-q :生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
可能会用到的其他选项:
-k :在生成索引时,不搜索/usr/include目录;
-i :如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪里去找源文件列表;
-I dir :在-I选项指出的目录中查找头文件
-u :扫描所有文件,重新生成交叉索引文件;
-C :在搜索时忽略大小写;-P path:在以相对路径表示的文件前加上的path,这样你不用切换到你数据库文件的目录也可以使用它了。
下面我们来操练一下, 查找函数vim_strsave()的定义, 用命令:
:cs find g vim_strsave |
如下图:
按下回车后会自动跳转到vim_strsave()的定义处. 此时你肯定会说Ctags也可以做到这个呀, 那么下面说的这个Ctags就无法做到了, 我想查找vim_strsave()到底在那些地方被调用过了, 用命令:
|
按下回车后vim会自动跳转到第一个符合要求的地方, 并且在命令栏显示有多少符合要求的结果, 如图:
如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口:
:cw |
如图:
这时你就可以慢慢挑选了^_^
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 | 查找包含本文件的文件 |
如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到/etc/vimrc中, 并重启vim:
62 nmap <C-@>s:scs find s <C-R>=expand("<cword>")<CR><CR>
63 nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR>
64 nmap <C-@>c :scs find c <C-R>=expand("<cword>")<CR><CR>
65 nmap <C-@>t :scs find t <C-R>=expand("<cword>")<CR><CR>
66 nmap <C-@>e :scs find e <C-R>=expand("<cword>")<CR><CR>
67 nmap <C-@>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
68 "nmap <C-@>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
69 nmap <C-@>d :scs find d <C-R>=expand("<cword>")<CR><CR>
70 nmap <C-@>i :scs find i <C-R>=expand("<cfile>")<CR><CR>
使用时,将光标停留在要查找的对象上,按下<C-@>g,即先按“Ctrl+@”,然后很快再按“g”,将会查找该对象的定义。
具体的看这个:
http://cscope.sourceforge.net/cscope_maps.vim
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CSCOPE settings for vim
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"
" This file contains some boilerplate settings for vim's cscope interface,
" plus some keyboard mappings that I've found useful.
"
" USAGE:
" -- vim 6: Stick this file in your ~/.vim/plugin directory (or in a
" 'plugin' directory in some other directory that is in your
" 'runtimepath'.
"
" -- vim 5: Stick this file somewhere and 'source cscope.vim' it from
" your ~/.vimrc file (or cut and paste it into your .vimrc).
"
" NOTE:
" These key maps use multiple keystrokes (2 or 3 keys). If you find that vim
" keeps timing you out before you can complete them, try changing your timeout
" settings, as explained below.
"
" Happy cscoping,
"
" Jason Duell jduell@alumni.princeton.edu 2002/3/7
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" This tests to see if vim was configured with the '--enable-cscope' option
" when it was compiled. If it wasn't, time to recompile vim...
if has("cscope")
""""""""""""" Standard cscope/vim boilerplate
" use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t'
set cscopetag
" check cscope for definition of a symbol before checking ctags: set to 1
" if you want the reverse search order.
set csto=0
" add any cscope database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add the database pointed to by environment variable
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
" show msg when any other cscope db added
set cscopeverbose
""""""""""""" My cscope/vim key mappings
"
" The following maps all invoke one of the following cscope search types:
"
" 's' symbol: find all references to the token under cursor
" 'g' global: find global definition(s) of the token under cursor
" 'c' calls: find all calls to the function name under cursor
" 't' text: find all instances of the text under cursor
" 'e' egrep: egrep search for the word under cursor
" 'f' file: open the filename under cursor
" 'i' includes: find files that include the filename under cursor
" 'd' called: find functions that function under cursor calls
"
" Below are three sets of the maps: one set that just jumps to your
" search result, one that splits the existing vim window horizontally and
" diplays your search result in the new window, and one that does the same
" thing, but does a vertical split instead (vim 6 only).
"
" I've used CTRL-\ and CTRL-@ as the starting keys for these maps, as it's
" unlikely that you need their default mappings (CTRL-\'s default use is
" as part of CTRL-\ CTRL-N typemap, which basically just does the same
" thing as hitting 'escape': CTRL-@ doesn't seem to have any default use).
" If you don't like using 'CTRL-@' or CTRL-\, , you can change some or all
" of these maps to use other keys. One likely candidate is 'CTRL-_'
" (which also maps to CTRL-/, which is easier to type). By default it is
" used to switch between Hebrew and English keyboard mode.
"
" All of the maps involving the <cfile> macro use '^<cfile>$': this is so
" that searches over '#include <time.h>" return only references to
" 'time.h', and not 'sys/time.h', etc. (by default cscope will return all
" files that contain 'time.h' as part of their name).
" To do the first type of search, hit 'CTRL-\', followed by one of the
" cscope search types above (s,g,c,t,e,f,i,d). The result of your cscope
" search will be displayed in the current window. You can use CTRL-T to
" go back to where you were before the search.
"
nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>e :cs find e <C-R>=expand("<cword>")<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>
nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
" Using 'CTRL-spacebar' (intepreted as CTRL-@ by vim) then a search type
" makes the vim window split horizontally, with search result displayed in
" the new window.
"
" (Note: earlier versions of vim may not have the :scs command, but it
" can be simulated roughly via:
" nmap <C-@>s <C-W><C-S> :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>s :scs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :scs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :scs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :scs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :scs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :scs find d <C-R>=expand("<cword>")<CR><CR>
" Hitting CTRL-space *twice* before the search type does a vertical
" split instead of a horizontal one (vim 6 and up only)
"
" (Note: you may wish to put a 'set splitright' in your .vimrc
" if you prefer the new window on the right instead of the left
nmap <C-@><C-@>s :vert scs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@><C-@>g :vert scs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@><C-@>c :vert scs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@><C-@>t :vert scs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@><C-@>e :vert scs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@><C-@>f :vert scs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@><C-@>i :vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@><C-@>d :vert scs find d <C-R>=expand("<cword>")<CR><CR>
""""""""""""" key map timeouts
"
" By default Vim will only wait 1 second for each keystroke in a mapping.
" You may find that too short with the above typemaps. If so, you should
" either turn off mapping timeouts via 'notimeout'.
"
"set notimeout
"
" Or, you can keep timeouts, by uncommenting the timeoutlen line below,
" with your own personal favorite value (in milliseconds):
"
"set timeoutlen=4000
"
" Either way, since mapping timeout settings by default also set the
" timeouts for multicharacter 'keys codes' (like <F1>), you should also
" set ttimeout and ttimeoutlen: otherwise, you will experience strange
" delays as vim waits for a keystroke after you hit ESC (it will be
" waiting to see if the ESC is actually part of a key code like <F1>).
"
"set ttimeout
"
" personally, I find a tenth of a second to work well for key code
" timeouts. If you experience problems and have a slow terminal or network
" connection, set it higher. If you don't set ttimeoutlen, the value for
" timeoutlent (default: 1000 = 1 second, which is sluggish) is used.
"
"set ttimeoutlen=100
endif
cscope的其他功能你可以通过帮助手册自己慢慢学习
reset : 重新初始化所有连接。
用法 : cs reset