Vi/Vim 是所有 Unix/Linux 操作系统默认配备的编辑器。因其强大的功能和高效的操作,Vi/Vim 也成为众多 Unix/Linux 用户、管理员必须掌握并熟练使用的编辑工具之一。
我在学习和使用linux的过程中,基本都是使用vim来写程序,用得越多也用得越熟悉,也越发现vim的强大之处,下面我就作些笔记,把最常用的vim命令记一记。
1.vim的启动与切换
vim <filename> 即可打开需要查看的文件,当文件不存在时系统会自动建立新文件;
:open file,or :e <filename> 在vim窗口中打开一个新文件;
:q 退出vim, :wq :q! shitf+zz ;
当需要从vim的编辑界面临时切换到shell环境下时,可以采用如下3种方式,非常方便。
- :! + command 即可在vim下执行shell命令, 如: :!ls -al ;
- 使用 Ctrl-z 以及 fg 这两个命令组合,ctrl-z将vim进程放入后台运行,执行完shell命令之后,fg将vim拿回前台执行;
- 在 Vi/Vim 的正常模式下输入 :sh即可进入 Linux/Unix shell 环境。在要返回到 Vi/Vim 编辑环境时,输入 exit 命令即可。
2.vim的操作单位
在使用vim时,弄清vim命令的操作单位十分有必要。
Vi/Vim 中操作单位有很多,主要包括:
- 字符(h、l):以字符为单位,h前一字符,l后一字符;
- 单词 (w、W、b、B、e) :小写以非字母字符为分割,大写以非空白字符(空格、Tab)分隔;w下一个单词,b上一个单词,e光标所在单词结尾;
- 行 (j、k、0、^、$、:n):j下一行,k上一行,^ 0行首,$行尾,:n 跳到n行;
- 句子((、)):VI以标点符号?、。!中的一个,当这些标点后至少有2个空格,或者作为一行的最后一个非空格字符出现;
- 段落({、}):段落以空行为分割;
- 屏 (H、M、L):H 移动到屏幕的第一行,M 移动到屏幕的中间一行 L 移动到屏幕的最后一行;
- 页(Ctrl-f、Ctrl-b、Ctrl-u、Ctrl-d):Ctrl-f 向前滚动一页,Ctrl-b 向后滚动一页, Ctrl-u 向前滚动半页,Ctrl-d 向后滚动半页
- 文件(G、gg、:0、:$):G 移动到文件末尾,gg 移动到文件开头;
- 特殊:%(跳转到与之匹配的括号处),`.(跳转到最近修改过的位置并定位编辑点),‘.(跳转到最近修改过的位置但不定位编辑点)。
vim移动的 操作范围 = 操作次数 * 操作单位。比如:10l 命令右移 10 个字符,8w 命令右移 8 个单词。
3.vim的编辑命令
插入命令:
- i insert 在当前光标之前插入
- a append 在当前光标之后插入
- I 大写在行首插入
- A 大写在行尾插入
- o 在当前光标所在行的下面一行插入
- I 在当前光标所在行的上面一行插入
修改命令:
- x 删除当前字符, 3x 删除当前光标开始向后三个字符;
- dd 删除当前行, 10d 删除当前行开始的10行, :11,$d 删除11行及以后所有的行;
- yy 拷贝当前行, 2yy拷贝当前行及其下一行;
- p 在当前光标后粘贴;
- u , Ctrl-R ,撤消与前进;
- ~ 光标字母大小写反转,guw 光标单词小写 ,gUw 光标单词变为大写 ,guu 光标行所有字符小写,gUU 光标行所有字符变为大写 ,g~~ 光标行所有字符大小写反转;
- . 点重复上一条命令,点号在linux的其他地方也有很多用法(点号的五种用法);
- >> 右缩进 ,<< 左缩进, 配合操作数使用,在编辑源码的时候非常有用;
多行注释:
- 1. 进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
- 2. 按大写字母I,再插入注释符,例如//
- 3. 按esc键就会全部注释了
取消多行注释:
- 1. 进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
- 2. 按字母j,或者k选中注释符号
- 3. 按d键就可全部取消注释
4.vim搜索与替换
- /string 向前搜索指定字符串;
- ?string 从光标处开始向上开始查找字符从string;
- 因为支持正则表达式,所以vim中有一些特殊字符在查找时需要转义 .*[]^%/?~$;
- n 搜索下一个;
- N 反向搜索下一个;
- * 在文件中向前搜索当前光标所在的单词;
- # 在文件中向后搜索当前光标所在的单词;
- :m,ns/str1/str2/g 将 m 行到 n 行中的字串 str1 全部替换为字串 str2;
5.vim环境设置
- :set 查看vim环境变量
- :set number 显示行号
- :set no number 取消行号显示
- :set autoindent 设置自动缩进
- :set no autoindent 取消自动缩进设置
- :set shiftwidth=4 设置缩进宽度为 4
- :set ignorecase 设置忽略大小
- :set no ignorecase 取消忽略大小设置
- :set list 显示不可见字符
- :set nolist 取消显示不可见字符设置
- :set hlsearch 高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配
- :set nohlsearch 关闭高亮搜索显示
- :set wrapscan 重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启
有时候在vim打开文件时发现代码的缩进错位,这很有可能是由于tab键在不同环境下设置的空格数不同造成的。
对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!
6.vim多屏操作
vim的多屏操作很适合查看大型的项目
- :new 水平切割窗口,默认打开空白窗口
- :split 水平切割窗口(或者直接输入:sp ),默认打开当前文件
- :vsplit 垂直切割( 也可以 :vsp )
- Ctrl+ww 移动到下一个窗口
- Ctrl+w+(hjkl) 向不同方向移动窗口;
- vim -o a.txt b.txt c.txt为每一个文件打开一个水平分割窗口
- vim -O a.txt b.txt c.txt为每一个文件打开一个垂直分割窗口
vimdiff命令: 对比两个文件的差异,代码merge十分方便
- vim -d file1 file2 或 vimdiff file1 file2 , 使用vim的比较模式打开两个文件;
- :diffthis 用split方式打开了两个文件file1,file2,比较两文件的不同,分别在两个窗口里面输入该命令;
- [c 跳到前一个不同点
- ]c 跳到后一个不同点
- dp 将差异点的当前文档内容应用到另一文档(diff put)
- do 将差异点的另一文档的内容拷贝到当前文档(diff get)
- :set diffopt=context:3 , vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠
- zf 创建折叠(使用数字表示创建有当前行到下多少行的折叠,比如3j就创建包括4行的折叠)
- zo 打开折叠(l也可以打开折叠)
- zc 关闭当前折叠
- zm 关闭所有折叠
- zr 打开所有折叠
- zE 删除所有折叠
- zd 删除当前折叠
- za 若当前打开则关闭,若当前关闭则打开(这个十分方便)
- zj 到下一折叠的开始处
- zk 到上一折叠的末尾
先总结这么多,还有像函数跳转等一些命令,等等,用到的时候再去整理吧,看一遍可能只能记住一小会,只有实际应用才会形成潜意识!
推荐 http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/
这篇文章是我见过介绍vim基本命令最有条理的文章的了,本文也借鉴了其中很多内容,表示感谢!
最后插入一张vim命令神图: