<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
vim(vi) 是Linux 中功能强大的编辑工具。vim 有3 中主要的模式:
1.normal mode :当进入vim 时,默认的模式就是normal mode 。在此模式下,无法输入任何文字,不过可以利用按键命令来执行许多操作命令,例如移动光标位置、复制、删除。
2.insert mode :进入vim 输入a 、i 、或o 键。即可进入insert mode ,此模式下可以输入文字内容。
3.command-line mode :在norma lmode 中输入“:” 即会进入command-line mode ,在此模式下,可以做一些与输入文字无关的事,例如搜索字符串、保存文件或结束编辑等。
在 normal mode 下:
h :将光标向左移动一格
l :将光标向右移动一格
j :将光标向下移动一格
k :将光标向上移动一格
w : 以单词为单位向右移动光标,支持计数,如3w,向右移动3个单词
b 向左移动一个单词,把符号或标点当作单词处理,如3b,向前移动3个单词
H :跳转到本屏幕的开始
M: 跳转到本屏幕的中间
L: 跳转到本屏幕的结尾
ctrl+b :将页面向前卷动一页
ctrl+f :将页面向后卷动一页
0 :将光标移到该行最前面
$ :将光标移到该行的最后面
G :将光标移到最后一行的开头
. :重复上一次操作 * :向下搜索光标所在词。 # :向上搜索光标所在词。w 或W :将光标移到下一个字
若输入“w” ,则标点符号如“.” ,“,” ,“/” 等字符都被当成一个字
e 或E :将光标移到本单字的最后一个字符;如果光标所在位置为本单字的最后一个字符,则跳到下一个单字的最后一个字符。
若输入“w” ,则标点符号如“.” ,“,” ,“/” 等字符都被当成一个字
b :将光标移到本单词的第一个字符;如果光标所在位置为本单词的第一个字符,则跳到上一个单字的第一个字符。
ctrl+u :将光标向前移动半页
ctrl+d :将光标向右移动半页
ctrl+e :屏幕向下卷动一行,也可以说文章和光标向上卷动一行
ctrl+y :屏幕向上卷动一行,也可以说文章和光标向下卷动一行
在 command-line mode 下:
e 文件的路径及名称:打开指定文件
a :从当前光标所在的位置的下一个字符开始输入
i :在光标所在的位置插入新输入的字符
o :新增加的一行,并将光标移到下一行的开头
w :文件的路径及名称 保存文件
q :退出vim
Vim的常用操作命令
vi中替换命令
1. 基本的替换
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/vivian/sky/(等同于 :g/vivian/s//sky/)替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
2. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
3. 删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M,请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
使用命令:cat filename1 | tr -d “^V^M” > newfile;
使用命令:sed -e “s/^V^M//” filename > outputfilename
需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:
:%s/^V^M// :%s/^M$//g
如果上述方法无用,则正确的解决办法是:
tr -d “\r” < src >dest
tr -d “\015〃 dest
strings A>B
4. 其它用法
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
复制文字
yy :可将光标目前所在位置的正行复制,复制时不会将文字反白显示
nyy :其中n 为数字键,表示要复制的行数,若按3yy ,则连同光标所在的位置的一行,与下面2 行一起复制
yw :可复制光标所在位置到整个单词结束的字符
nyw :n 表示要复制的单词数目,若按3yw ,则会将目前光标所在位置到单词结束,以及后面的2 个字一起复制
y$ :从光标当前位置复制到行尾。
y0 :从光标当前位置复制到行首。
yG 复制光标以下的所有行
p :可将复制的文字粘贴到当前光标所在的位置。若复制的是整行文字,则会将整行内容粘贴在光标所在位置的下一行
删除文字
d :先按d 键,放开后按←键,可将光标位置前一个字符删除;按→键,则会将光标位置的字符删除;按↑键,可将当前光标所在的行与前一行一并删除。按↓键,可将当前的光标所在的行与下一行删除。
D :可删除一行中光标所在位置之后的所有字符。
dd :连续按2 次d 键可删除光标所在的那一行。
dw :将光标停在某个字的第一个字符,按dw 键时,会将此字整个删除。如将光标置在某个字中间的字符上,则会将此字中光标后面的字符删除。
nd :n 为数字,如按3d ,再按下↑键,则删除光标上方的3 行,再包括本身1 行,共删除4 行。若按下↓键,则删除光标下方3 行再包括本身1 行,共4 行。
ndd :若按3dd 键,表示删除当前光标位置的1 行和下面的2 行。
x :删除光标所在位置的字符
X :删除光标所在位置的前一个字符,与d+← 键一样
nx :按4x 键,表示删除光标位置后的3 个字符和光标本身所在的字符
nX :按4X 键,表示删除光标位置之前的4 个字符(不包括光标的字符)
查找及替换文字
/ 或?:当要搜索文章中的某一个字符串时,可输入“/” 或“?” ,然后在输入要查找的字符串。例如输入“/kuka” ,然后按回车键,vim 就会把所有的kuka字符串标记起来,并自动将光标移到第一个找到的字符串上。
n :将光标移到下一个找到的字符串上
N :将光标移到上一个找到的字符串上
r :替换光标所在的位置的字符。修改内容不一定要进入insert mode ,在normal mode 中,只要将光标移到要更改的字符上,然后按R 键,就可以输入要查找的字符了。
R :连续替换光标所在的位置的字符,按Esc 键停止替换
cc :按cc 键可以替换光标所在的那一行
替换字符串:当要将文章中的某一个字符串全部替换时(例如将所有的temp 替换成tmp ),使用“:g/temp/s//tmp/g” 或“:1,$stemp/tmp/g” 命令,可立刻将所有的“temp” 替换成“tmp” 字符串。如果不是所有的“temp” 字符串都要替换时,可用“:g/temp/s//tmp/gc” 或“:1/,$stemp/tmp/gc” 命令。则找到每一个“temp” 字符串时,都会将整行显示在屏幕的下方,可输入“y” 或“n” 决定是否要替换。
显示光标所在的行数、移到指定的行数
^g 、^G :按次组合键,则会在最下方处显示光标所造位置的行数,以及文章的总行数。
nG :n 为数字,若按下20G ,则可将光标移到第20 行。
还原
u :按此键就是在执行undo 命令,可取消前一次的操作
^r :按此键就是执行redo 命令,可以恢复刚才undo 的操作
多行同右左移动
:12,14 》 //右移 :12,16《 //左移
操作多列
ctr+v -> 选择要操作的多咧 -> 执行要做的操作->esc
:set nu 设置行号 :set nonu 取消行号显示
用 vim + ctags 阅读源代码 首先我们必需给要阅读的源代码建一个或者多个tags 文件,在shell 下利用ctags 命令给单个文件建立tags 如下: ctags filename.c 要给同一个目录下的所有文件建立tags如下: ctags -R 这时在tags文件所在的目录下打开源文件阅读,vim就会自动调用tags文件。 如果tags文件不在当前目录下,可以在命令模式下用下面的命令设置tag文件 :set tag=tag_file_path
要在vim下跳到一个函数的定义处可以在命令模式下用下面的命令: :tag fuction_name 这个命令将把你带到fuction_name函数的定义处。 另外,ctrl + ]命令会把当前光标下的单词作为tag的名字,并直接跳转。当找不到所选的tag时,输入命令":tselect" 用ctrl + t命令可以回到前一个tag,你可以在ctrl + t前面加一个数字 表示往回跳的层数。 使用Ctrl + g可以显示当前正在编辑的文件名,及所在的行号 另外,如果源文件的排版比较乱的话,可以通过命令 gg=G 来格式化整个源文件。 下面这几个设置可以帮助你更好的设置代码缩进 :set cindent :set shiftwidth=4 :set tabstop=4
taglist常用命令
安装:
先要安装ctags:yum install ctags
到Vim主页(http://www.vim.org/scripts/script.php?script_id=273)下载taglist,下载是一个zip包;然后打开home目录,建立新文件夹“.vim”,已经存在就不用建了;把解压后的“tagslist_45”文件夹里的文件(不是整个“tagslist_45”文件夹)移动到“.vim”目录去。
常用指令如下: 1.切换函数列表的开、关
:TlistToggle。 或 :Tlist
2.在正常编辑区域和tags区域中切换 ctrl+w+w。 3.定位指定内容 在tags区域中,把光标移动到变量、函数名称上,然后敲回车,就会自动在正常编辑区域中定位到指定内容了,很方便的。 4. 查找相关函数或变量 :ts param
5. 显示帮组信息
:help talist.txt
6.其他命令
u 更新taglist窗口中的tag s 更改排序方式,在按名字排序和按出现顺序排序间切换 x taglist窗口放大和缩小,方便查看较长的tag + 打开一个折叠,同zo - 将tag折叠起来,同zc * 打开所有的折叠,同zR = 将所有tag折叠起来,同zM [[ 跳到前一个文件 ]] 跳到后一个文件 q 关闭taglist窗口
首先在目录下建立cscope索引文件
find -name '*.c' > cscope.file
cscope -Rbkq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。 其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。 上面所用到的命令参数,含义如下:
-R: 在生成索引文件时,搜索子目录树中的代码 -b: 只生成索引文件,不进入cscope的界面 -k: 在生成索引文件时,不搜索/usr/include目录 -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
如果要关联其他类型的文件(如 .cpp、.java等),就需要我们自己先生成一个 cscope.files,把所有我们希望关联进去的文件都列在里面: $ find /home/edelweiss/nbd/nbd-2.9.15/ -name '*.c' -o -name '*.cpp' -o -name '*.h' / > /home/edelweiss/cscope.files 注意查找的路径一定要写成绝对路径,这样才能保证写入到 cscope.files 文件中的也是绝对路径。 之后就可以根据 cscope.files 建立数据库了: $ cscope -bq -i /home/edelweiss/cscope.files
:cs help
cscope commands:
add : Add a new database (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
c: Find functions calling this function
d: Find functions called by this function
e: Find this egrep pattern
f: Find this file
g: Find this definition
i: Find files #including this file
s: Find this C symbol
t: Find assignments to
help : Show this message (Usage: help)
kill : Kill a connection (Usage: kill #)
reset: Reinit all connections (Usage: reset)
show : Show connections (Usage: show)
s:查找C语言符号,即查找函数名、宏、枚举值等出现的地方 g:查找函数、宏、枚举等定义的位置,类似ctags所提供的功能 d:查找本函数调用的函数 c:查找调用本函数的函数 t:查找指定的字符串 e:查找egrep模式,相当于egrep功能,但查找速度快多了 f:查找并打开文件,类似vim的find功能 i:查找包含本文件的文
:cs find g do_fork
就可以查看do_fork的全局定义了。
cscope常用快捷键:
先按 ctrl+/ 然后 再按以下键:
1. c: 查找该函数被调用的位置
2. d: 查找该函数调用了哪些函数
3. e: 查找指定的正规表达式 f: 查找指定的文件
4. g: 查找指定标识符的定义位置
5. i: 查找该文件在哪些地方被包含
6. s: 查找指定标识符的使用位置
7. t: 查找指定的文本字符串