己经常使用到的vi/Vim使用技巧整理一下,希望对大家有用:
(一) 通用操作:
1. 指令模式到输入模式指令:
a (append ) :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。
A : 从光标所在列最後面的地方开始新增资料。
i (insert ): 从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。
I :从光标所在列的第一个非空白字元前面开始插入资料。
o (open ):在光标所在列下新增一列并进入输入模式。
O: 在光标所在列上方新增一列并进入输入模式
s : 删除光标所在字元,并进入输入模式
S : 删除光标所在的列,并进入输入模式
2. 编辑指令
x : 删除光标所在字符。
dd :删除光标所在行。
r :修改光标所在字符,r 后接修正的字符。
R : 替换状态,新增文字覆盖原先文字,直到按 [ESC] 为止。
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
3. 移动按键
在指令模式下移动光标的基本指令是 h, j, k, l
u :恢复被删除的文字
shift + u: 恢复光标所在列的所有改变
ctrl+d: 向下半页
ctrl+f: 向下一页
ctrl+u: 向上半页
ctrl+b: 向上一页
shift+h: 移动到视窗的第一列
shift+m: 移动到视窗的中间列
shift+l: 移动到视窗的最後列
b 移动到下个字的第一个字母
w 移动到上个字的第一个字母
e 移动到下个字的最後一个字母
^ 移动到光标所在列的第一个非空白字元
$ 光标所在位置到该列的最後一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最後一个字母
{ 光标所在位置到该段落的第一个字母
'''''''' 此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查找到某个单词后, 再输入此命令则回到上次停留的位置.
''''. 此命令相当好使, 它移动光标到上一次的修改行.
`. 此命令相当强大, 它移动光标到上一次的修改点.
4. 拷贝, 删除与粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.
yw 表示拷贝从当前光标到光标所在单词结尾的内容.
dw 表示删除从当前光标到光标所在单词结尾的内容.
y0 表示拷贝从当前光标到光标所在行首的内容.
d0 表示删除从当前光标到光标所在行首的内容.
y$ 表示拷贝从当前光标到光标所在行尾的内容.
d$ 表示删除从当前光标到光标所在行尾的内容.
yfa 表示拷贝从当前光标到光标后面的第一个a 字符之间的内容.
dfa 表示删除从当前光标到光标后面的第一个a 字符之间的内容.
特殊地:
yy 表示拷贝光标所在行.
dd 表示删除光标所在行.
D 表示删除从当前光标到光标所在行尾的内容.
关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
(二) vi/vim 的设置项(输入到/etc/vimrc 或者~/.vimrc 文件中产生效果)
“双引号开始的行为注释行,下同
set nocompatible “去掉讨厌的有关vi 一致性模式,避免以前版本的一些bug 和局限
set number “显示行号
filetype on “检测文件的类型
set history=1000 “记录历史的行数
set background=dark “背景使用黑色
syntax on “语法高亮度显示
set autoindent “vim 使用自动对齐,也就是把当前行的对起格式应用到下一行;
set smartindent “依据上面的对起格式,智能的选择对起方式,对于类似C 语言编
set tabstop=4 “设置tab 键为4 个空格
set shiftwidth=4 “设置当行之间交错时使用4 个空格
set expandtab "设置tab键扩展为空格
set showmatch “设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set guioptions=T “去除vim 的GUI 版本中的toolbar
set vb t_vb= “当vim 进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set ruler “在编辑过程中,在右下角显示光标位置的状态行
set hlsearch “高亮显示:
set incsearch
(三) autocmd
这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.
:autocmd! 删除所有之前的自动命令.
autocmd FileType java source ~/.vim/files/java.vim
autocmd FileType java source ~/.vim/files/jcommenter.vim
以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel
以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
autocmd BufNewFile *.java normal gnp
以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
<< 输入此命令则光标所在行向左移动一个 tab.
>> 输入此命令则光标所在行向右移动一个 tab.
5>> 输入此命令则光标后 5 行向右移动一个 tab.
:12,24> 此命令将12 行到14 行的数据都向右移动一个 tab.
:12,24>> 此命令将12 行到14 行的数据都向右移动两个 tab.
(四) 替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串. 以下提供几个例子.
:s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/\/bb/g 将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
:%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g 将从12 行到23 行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/ 将从12 行到23 行的行首加入 # 字符
:%s= *$== 将所有行尾多余的空格删除
:g/^\s*$/d 将所有不包含字符( 空格也不包含) 的空行删除.
(五) 多文件编辑
在一个 vim 程序中打开很多文件进行编辑是挺方便的.
:sp(:vsp) 文件名 vim 将分割出一个横( 纵) 向窗口, 并在该窗口中打开新文件.
从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
到帮助信息.
:e 文件名 vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
c-w-w vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位到各个窗口之中.
:ls 此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
会显示出如下数据:
1 %a "usevim.html" 行 162
2 # "xxxxxx.html" 行 0
其中:
1 表示打开的文件序号, 这个序号很有用处.
%a 表示文件代号, % 表示当前编辑的文件,
# 表示上次编辑的文件
"usevim.html" 表示文件名.
行 162 表示光标位置.
:b 序号( 代号) 将指定序号( 代号) 的文件在本窗口打开, 序号( 代号) 是用 :ls 命令看到的.
:set diff 此命令用于比较两个文件, 可以用
:vsp filename
命令打开另一个文件, 然后在每个文件窗口中输入此命令, 就能看到效果了.
(六) 数字与命令
在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
5fx 表示查找光标后第 5 个 x 字符.
5w(e) 移动光标到下五个单词.
5yy 表示拷贝光标以下 5 行.
5dd 表示删除光标以下 5 行.
y2fa 表示拷贝从当前光标到光标后面的第二个a 字符之间的内容.
:12,24y 表示拷贝第12 行到第24 行之间的内容.
:12,y 表示拷贝第12 行到光标所在行之间的内容.
:,24y 表示拷贝光标所在行到第24 行之间的内容. 删除类似.
(七) 组合键:
ctrl+p(ctrl+n) 向上( 下) 搜索开头与其匹配的单词并补齐, 在所有这个 vim 程序中打开的文件中进行匹配。
ctrl+x+l 快速补齐整行内容, 但是仅在本窗口中出现的文档中进行匹配.
ctrl+x+f 这个命令表示补齐文件名, 如:/ho 自动匹配出/home/
abbr 即缩写. 在编辑模式中用一个缩写代替另一个字符串. 如c 中打印printf("",) ;
可用 缩写来减少敲字。在命令行输入::abbr pf printf("",); 以后在输入pf 后
再输入 (enter/tab/ 空格), 它就会自动扩展为printf("",);
(八) 添加命令:r
:r filename 该命令将filename 文件的内容自动添加到光标所在位置的后面
:r !cmd 其中cmd 是shell 命令,该指令将cmd 的结果添加到光标所在位置的后面
(九) vi 与ctags
将Linux的vi和ctags工具结合起来使用时比较常见的。
首先需要某一个目录中,在控制终端输入:
ctags -R * 该命令在当前目录下产生一个“tags ”文件, 将该目录的文件和对应的子目录的文件的代码之间的标记关联建立起来。
然后再控制终端打开一个文件, 可以直接打开某一个标志所在的文件, 并指向这个标志:
vi -t tag ( 请把tag 替换为您欲查找的变量或函数名) ,该命令将vi 直接定位到tag 标志定义的地方。 也可以通过vi filename 直接打开某一个文件。
打开某一个文件之后,在可以在vi 环境中进行相关的操作了。
Ctrl + ] 把光标移到变量名或函数名上,然后按下“Ctrl+] ”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行
Ctrl + T 用“Ctrl+t ”可以退回原来的地方。即使用户使用了N 次“Ctrl+] ”查找了N 个变量,按N 次“Ctrl+t ”也能回到最初打开的文件,它会按原路返回 。
注意!运行vim 的时候,必须在“tags ”文件所在的目录下运行。否则,运行vim 的时候还要用“:settags= ”命令设定“tags ”文件的路径,这样vim 才能找到“tags ”文件。在完成编码时,可以手工删掉tags 文件
在vi内部使用
:!ctags file.c 该命令将在当前目录下创建一个tags名称文档,文档中包括了file.c文档中定义的函数信息。
:!ctags *.c 创建当前目录下任何C源文档的tags文档
:tag name 能够定位到name函数定义处
参考:http://blog.mcuol.com/User/wjh_84/Article/38730_1.htm
O
O
O
O
O
O