一:vi ,vim, gvim简介

vi的功能是最弱的,它是*nix操作系统下最基本的文本编辑器。

vim一开始的功能还不如vi,那个时候它的全称是“Vi IMitation”,即vi模拟器。1992年Vim被移植到了Unix和Dos上,Vim重命名为“ViIMproved”,即vi加强版。

gvim是Vim的图形前端,是跨平台的编辑器,而且也保持了Vim的风格,可以说,gvim的功能比vim更适合新手去用,功能也更强一些。

gvim也支持鼠标操作,这更是为windows下喜欢用鼠标的用户不至于一开始就感觉无从下手,但是,真正的快速高效是不要用鼠标去使用vim的,就像我们用五笔输入法几乎不用按数字键去选字。

二:三种模式

vim编辑器是一个模式编辑器,它有三种模式;正常模式、插入模式、底行模式。这三个模式下的我们的键盘的按键所起到的作用是不一样的。

1:Normal模式是“正常模式”,这时候我们输入的每一个字符会被当做一个命令,刚启动vim时就工作于normal模式。它的主要功能就是控制屏幕光标的移动、进行文本的删除、复制等文字编辑工作,比如此时的h表示光标向左移动一格。

2:Insert模式是“插入模式”,这时候和普通的文本编辑器就很相似了,键盘输入什么就在屏幕上显示什么,比如我们此时敲击键盘上的h表示在屏幕上显示h字符。

3:last linemode即”底行模式”,它主要用于保存文件或者退出vim,同时也可以设置编辑环境和一些编译工作,比如列出行号、查找字符串等等。也有些人把底行模式并入命令模式,这个没有硬性规定。

4:三种模式的转化方式如下图:

在任何一种模式下,都可以用ESC键来回到命令模式,然后用命令模式切换到其他模式下。

5:vim可以用键盘搞定一切事情,在vim下进行文本编辑也好,进行代码书写也好,一定不要用鼠标,只用键盘就可以了,因为,来回使用鼠标肯定会让你的速度变慢,这一点,必须习惯,如果你还是坚持用鼠标的话,那么很抱歉,你无法真正地体验到vim编程会有多快。

三:最常用的一些命令

移动:

1:在normal模式下,用h表示向左移动光标,用j表示向下移动光标,用k表示向上移动光标,用l表示向右移动光标。

2:w是“word”的首字母。表示向后移动到下一个单词的首字母上,不管当前光标是在一个单词的开头、中间还是结尾。比如下面的例子:

hello, this is only atext,please ignore it.

不管光标处于单词“this”的哪个字母,输入w之后,光标都会处于单词“is”的首字母“i”上。

ge则表示移动到前一个单词的尾字母上,不管当前光标是在一个单词的开头、中间还是结尾。比如下面的例子:

hello, this is only atext,please ignore it.

不管光标处于单词“ignore”的哪个字母,输入ge之后,光标都会处于单词“please”的尾字母“e”上。

b是“begin”的首字母,表示移动到当前单词,或者前一个单词的首字母上,这取决于当前光标所处的位置,比如下面的例子:

hello, this is only atext,please ignore it.

如果光标处于单词“only”的首字母“o”上,则输入b之后,光标会处于单词“is”的首字母“i”上;如果光标处于单词“only”的其他字母,或者后面的空格上,则输入b之后,光标会处于“only”的首字母“o”上。

e是“end”的首字母,表示移动到当前单词,或者下一个单词的尾字母上,这取决于当前光标所处的位置,比如下面的例子:

hello, this is only atext,please ignore it.

如果光标处于单词“please”的尾字母“e”上,则输入e之后,光标会处于单词“ignore”的尾字母“e”上;如果光标处于单词“please”的其他字母,或者前面的空格上,则输入e之后,光标会处于“please”的尾字母“e”上。

 

w和ge对应,b和e对应。

有很多字符也被认为是word,比如“.”,”-“和“)”等都被认为是一个word,我们可以自由的定义这些word,这些我们到后面讲配置的时候再说。

3:“”命令则把光标移动到当前行的行首。“^”则是将光标移动到当前行的第一个非空白字符上,“g_”
是将光标移动到当前行的最后一个非空白字符上。

$命令还可以接受一个计数,比如1$会移动到当前行的行尾,2$则会移动到下一行的行尾,以此类推。而0命令和^命令的前面加上一个计数并没有任何效果。

4:w命令表示向后移动到下一个单词的开始处,3w则表示向后移动三个单词,3b表示向前移动三个单词,其他数字的功能也是类似的。

5:上面我们的移动功能都是一个单字符的命令,下面我们介绍f加上一个字符的命令,这里的f表示“find”,比如fx表示在当前位置向下定位到第一个x所在的位置。

f加一个字符表示向右搜索,而F加一个字符表示向左搜索。这两个命令仅限于一行内的移动,不会移动到其他行。

说完了f命令,下面说一下t命令。t是“to”的简写,比如tx表示向右寻找第一个x所在的位置,但是它不是把光标停留在被搜索的字符上,而是在它之前的前一个字符上。小写的t表示向右搜索,大写的T表示向左搜索。

6:上面的光标移动对于是否是程序员都很重要,但是有些移动写程序经常要用到,这是作为程序员必备的移动方式。

怎么样能快速匹配到括号对应的另一部分呢?我们只需要把光标移动到某一个括号(可以是左括号,也可以是右括号)上,然后点一下%命令,它会自动把光标定位到与之对应的括号的另一部分上。它可以处理小括号,中括号,大括号。

7:要显示行号,用:set number(:setnum)命令,也可以用:set nonumber(:setnonu)来取消显示行号。

8:可以用104G命令来把光标移动到104行的行首,注意这里的G需要是大写的。跳转到其他行也是同理,只修改前面的数字即可。

想要跳转到第一行的行首,那么可使用gg命令。

想要跳转到最后一行的行首,那么可使用G命令。

9:除了指定具体的行号之外,我们还可以使用50%命令来跳转到文件的中间位置,用80%命令跳转到文件的百分之八十的位置。

查找:

10:用/加一个单词,可以在整个文档中搜索这个单词,然后用数字加n的组合来定位第几个单词。

如果想要完整匹配一个单词,比如xin,那么可以用命令/\<xin\>来做到,其中\<表示匹配一个单词的开头,而\>则表示匹配一个单词的结束。

vim是支持正则表达式的。

编辑:

11:可以用x命令来删除一个字符,使用4x可以删除四个字符。

有类命令有一个固定的模式:“操作符命令+位移命令”。所谓位移命令,上面已经讲过的移动光标的命令。

dw命令可以删除一个word,d是“delete”的首字母,它后可以跟一个位移命令,它将删除从当前光标起点到位移的终点处的文本内容,比如d4w是删除四个单词。d4w和d4e都是可以删除从该光标处向后的四个单词。

由于$命令是移动光标到行尾,所以d$命令就是删除当前光标到行尾的内容,而且该行的最后一个字符也会被删除。

用daw就可以删除一个单词,不管光标在哪,它还会删除该单词末尾的空格。这里的d是delete的意思,而aw则是a word的意思,表示“一个单词”。

12:c和d命令很相似,不过它在命令执行后会进入Insert模式。比如cw命令会首先删除该word,并且会立即进入插入模式。

13:dd命令可以删除整行,而cc命令则可以改变整行。

14:r命令则是把当前位置的字符被我们键入的字符所替换,比如rx则是用x来替换当前位置的字符,而5rx表示从该字符之后的五个字符都是用x来替换。而我们用r之后按回车键,则会删除一个字符并且插入一个换行符,而r4<Enter>即我们按下r键和4键之后再按回车,会把接下来的四个字符替换为一个换行符。

15:重复操作使用.命令,比如/a来找到所有的a字符,然后在命令模式下键入clb,此时把第一个a换成了b,然后我们在用Esc键退回到命令模式下,然后用n命令来找到下一个被查找出的a字符,然后键入一个“.”,会发现这个“a”也被换成了“b”。

16:用d或者x命令删除文本的时候,被删除的内容还是被保存了起来,可以用p命令把它取出来,这里的p是put的意思,理解为paste也不错,即“粘贴”,但是它并不是vim的思维模式,是微软党的思维模式。

P命令(大写的P)和小写的p命令很相似,只是它会把该内容粘贴到光标字符之前。对于dd删除的整行内容,我们用P命令会把它放到当前行的上一行,对于dw删除的部分内容,P会把它放到光标之前。

17:上面说到d命令相当于“剪切”,p命令相当于“粘贴”,“复制”命令可以使用y命令,这里的y是“yank”的意思,翻译成汉语即“拉,抽”。

其实用copy来表示复制更好理解点,但是很可惜c命令同时也是“change”的第一个字母,该命令用于表示修改,所以也就没办法用c命令表示复制了,只能用yank的y命令表示复制。

y4w表示复制四个word,用yy来表示复制一行,Y命令也是复制整行的内容,而y$命令则是复制当前光标所在位置至行尾的命令。

18:在命令模式下键入v可以进入visual模式,该模式即“可视模式”,我们可以用Esc命令退出visual模式,返回到命令模式。

删除一些简单的文本对象我们用操作符命令+位移命令就足够了,但是对于我们想精确地指定范围,就必须使用visual模式了。

在visual模式下,用j命令表示向下再选中一行,用k命令向上选中一行,比如jj就是向下再选中两行,而4j就是向下再选中四行。其实这里的hjkl命令表示光标移动的命令在这里都是可用的,这里的gg则是表示从光标所在位置一直选中到开头部分。

19:如果希望用新输入的文本来代替那些已经存在的文本,此时就可以在命令模式下输入R来进入替换模式,替换模式类似于插入模式,但是它会用新输入的字符代替原来的字符。

四:最常用的一些操作

新建、打开、保存、另存为等操作要在底行模式下使用。

1:“:e”命令,后加一个文件路径,可以打开一个文件。

2:“:w”命令,后加上文件名,可以保存一个文件。而且还可以用“:sav”命令来实现另存为的功能。

3:其他命令,新建是“:enew”,关闭是“:close”,保存并退出是“:wq”。

4:如果编辑的文件有了后缀名,比如.php, .java之类的,那么vim会自动进行语法高亮,如果还没有给该文件命名,比如新建了一个文件,然后粘贴了一段php代码上去,如下图:

那么怎么在不保存文件名的前提下进行高亮显示呢?只需要设置一下文件类型就ok了,我们这里使用:set filetype=php来,如下截图:

5:还可以设置背景色,比如如下命令“:setbackground=dark”之后,如下图所示:(注:默认的情况下使用的background是light)

6:可以用“:colorscheme evening”来调整为黑夜模式,效果如下:

其实很多选项都可以写到配置文件里去,这样就会方便我们的操作了,而且更多的设置语法大家就要求助谷哥哥和度娘了。

7:要同时显示两个不同的文件,或者一个文件太长,需要在两个窗口中查看,或者是同步显示两个文件,很多时候需要多个窗口来做这件事。

最简单的就是两个窗口,在底行模式下输入“:split”来显示两个窗口,如果想关闭上面那个窗口,只需要把光标移动到上面那个文件上,然后在底行模式下输入“:close”即可关闭它。

如果开了n多窗口,但是只是重点关注其中一个,可以使用命令:only来关闭其他窗口。

使用命令“:ctrl+w+j/k”,通过j/k可以上下切换窗口。

8:如果想要水平分割,可以用“:vsplit”,它的用法和split一样,只是它是水平分割而已。

五:VIM常用的一些配置

在windows下,VIM配置文件通常是_vimrc, vim默认的背景色是白色的,感觉太晃眼了,如果喜欢黑色的背景,可以在最后面加入下面一条:

:colorscheme murphy

再添加一个修改字体的,设置如下:

set guifont=Courier\ New:h15

让它自动显示行号,添加如下配置项:

set number

经过上面的配置之后,重新启动VIM,打开的界面如下:

六:VIM中的宏

1:在vim中定义宏,通常分为三步:第一步,使用q{寄存器名}开始命令,后续的操作会被记录到该寄存器中,这里的寄存器名必须是a到z之间的一个字母。第二步,执行我们的那些繁杂的操作。第三步,按下q表示结束对命令的录制。

2:可以通过@{寄存器名}命令来执行刚刚记录下来的宏了。

3:实例:

打开vim,先敲入如下代码:

按下Esc键来进入命令模式,然后把鼠标移动到第一行,然后输入qx,也就是说定义义了一个寄存器,它的名字是x,界面如下:

先输入“^”命令,光标移动了行首,然后输入“i#include“”,截图如下:

按下Esc键来进入命令模式,然后执行$命令把光标移动到行尾,然后执行a”来给它加上双引号,然后按下Esc键来进入命令模式,然后我们输入j来把光标移动到下一行,此时效果如下:

然后我们输入q命令就可以了。然后执行命令3@x,之后效果如下:

4:由于最多有a-z 26个字母可用,因此,可以定义最多26个宏。

5:把鼠标移动到最后一行,然后在命令模式下用”xp来查看刚才的宏,说明一下,这里的”是双引号,这里的x是咱们的宏的名字,如果你并没有用x作为宏的名字,那么相应的命令替换为你的宏名,截图如下:

七:替换

1:替换的格式如下:

:s/查找字符/替换字符/[可选的修饰符]

上面的可选的修饰符,常用的有如下几个:g表示替换该行所有的符合的目标字符串,p表示列印,c表示每次执行替换的时候都需要请求确认,如果这个地方什么都不写,表示只是替换第一个匹配到的字符串。

还可以在s前面加一个范围参数,比如1,5就表示从第一行开始,到第五行结束,而且它是包括第一行和第五行的。比如命令:“:1,5s/include/qian/g“就是把第一行到第五行的所有include字符串替换为qian。

如果我们只想修改第4行的内容,可以用:4s/include/qian/g这个命令。

如果是全文替换,可以使用%,比如:”:%s/include/qian/g”命令。

如果是替换某个单词(include),而不是字符串(hincludeh),可以用命令:”:s/\<include\>/qian/g”,其中,<和>

八:其他

1:历史记录和命令补齐

vim支持历史记录和命令行补齐的,比如我们输入了:s,我们移动键盘上的↑(就是向上的箭头的那个按键),然后会发现历史命令,继续按几下该键,会发现更多的历史记录被翻出来。

所谓的自动补全就是用tab键来补全,比如我们输入:s的话,直接按tab键,会自动补齐为:sNext这个命令。

2:文件浏览

比如打开了一个python文件,下面我们可以用“:edit .”来查看它所在目录下的文件,值得注意的是,后面的.不能忽略,否则不是浏览当前目录,而是会显示当前的文件名。

可以通过“:pwd”来查看当前的工作目录,可以通过“:cd”来设置当前的工作目录。

可以用“:find”文件名的方式来查找文件,它是在当前的工作目录下查找的。

如果光标所在位置是个文件名或目录名,则键入“gf”命令,Vim 就会找到并打开这个文件。

3:其他

插入模式变种命令:

a:在光标后插入

o:在当前行之后插入新行

O:在当前行之前插入新行

cw:替换从光标到单词结束

caw:替换光标所在单词

转自《辛星VIM教程》

《VIM教程》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. POJ 3122 Pie (贪心+二分)

    My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N ...

  2. iOS -NSOperation并发编程

    http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...

  3. springMVC的功能和优点

    spring MVC是一个分层的java web开发框架,MVC模式提供了一个分层的体系结构,其中每一层对其它层进行了抽象,具体如下: 1.模型(Model):应用程序所使用的特定域信息的表现形式 2 ...

  4. 用 Python 写一个 NoSQL 数据库Python

    NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...

  5. Django多业务模块的写法

    from django.shortcuts import render # Create your views here. from django.shortcuts import HttpRespo ...

  6. Yii 学习笔记

    Yii常用执行SQL方法 ====================================================== ================================ ...

  7. 理解async和await

    async 是“异步”的简写,而 await 可以认为是 async wait 的简写. 所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执 ...

  8. C++ std::vector指定位置插入

    使用vector,必须加上:#include <vector> 1.初始化vector,一般有这几种方式: std::vector<std::wstring> v1; //创建 ...

  9. js读取解析JSON数据(转)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  10. Mac 电脑如何卸载 node

    因为刚入手「 Mac 」很多淫技还不懂,在一次使用 npm install 的时候安装出错,提示为 npm 与 node 的版本有问题,所以就想着卸载重新装一个版本. 但是因为刚使用「 Mac 」所以 ...