相信一个ACMer,是很少会去用vim来刷题的,毕竟长得不好看,对初学者不友好,但是高手总是推荐这样的好工具,确实也是有理由的

先贴两个入门链接:

http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/

上面是英文版本的:

再贴一个链接,是大神给的翻译版本:

http://www.cnblogs.com/lijia0511/p/5644566.html


有了这两个实现ACMer的简单做题,至少编程写代码方面是没有什么问题的

然后,介绍几条改变vim编辑器设置的命令:(为了配合ACMer的刷题习惯)

首先:添加行号,为了打印代码和自己调试时候的方便

sudo vim /etc/vim/vimrc
set nu

将set nu的命令写到文件末尾,保存即可


然后:语法高亮

在刚才打开的文件中,用命令找到syntax on的这一行,去掉前面的双引号(双引号是注释的意思),保存即可


还有:把tab键的跳跃格数改为4个,个人的编程习惯吧,毕竟windows下的IDE,做题都是4个

set ts=4
set expandtab
set autoindent


先介绍vim的两种模式:一种是insert模式,另一种是normal模式

如何从normal模式进入insert模式:i键或者insert键,然后乱敲键盘发现有字符了

如何从insert模式进入normal模式:狂按esc键


删除:

低级姿势:在insert模式下,使用空格,回车,Backspace来删除(当作普通编辑器来使用)(简单处理)

高级姿势:在normal模式下:使用剪切功能


剪切(要是配合上粘贴功能就是剪切,要是单独用就是删除呗):在normal模式下:

dd
Ndd
:1d
:1,5d

dd意为:删除当前光标所在的那一行

Ndd意为:删除当前光标所在的,从上往下连续N行,N为一个数字,例如3dd

:1d意为:删除第1行

:1,5d意为:删除第1行到第5行

如果输入的行号顺序有问题,如输入了5,3d,那么会显示:

Backwards range given, OK to swap(y/n)?

如果输入y,则意味着同意交换,相当于输入的命令是3,5d

如果输入的行号大小有问题,即超过了文档的行号范围,那么会显示

E16:Invalid range


复制:

yy
Nyy
y^
y$
:a,by

yy意为:复制当前光标所在的那一行

nyy意为:复制当前光标所在的,从上往下连续N行,N为一个数字,例如3yy

^是一个正则表达式的通配符:意为开头

$是一个正则表达式的通配符:意为结尾

y^意为:当前光标位置的那一行,从开头复制到光标所在位置(不包括光标处的字符)

y$意为:当前光标位置的那一行,从光标所在位置复制到结尾(包括光标处的字符)

:a,by:从第a行复制到第b行


如果结合选择的命令,可以实现更多的功能:

gg命令:将光标跳到文件开头首字符处

再接V命令:选中首行

再接G命令:选中全部当前文本


粘贴:

入门的时候,只需要记得p和P就好

p:在光标的当前行,之后插入剪切或者复制的代码

P:在光标的当前行,之前插入剪切或者复制的代码


改变与替换:(当然可以跳过这一部分的功能,在insert模式下,删除了再重新敲,但是能省时间(用来装)为什么不学呢)

<x>:删除光标当前所在的字符

<R>:替换字符序列(改成了REPLACE模式)

<r>:替换光标所在的字符

<cw>:替换一个单词(把当前光标后的单词删除,然后写入,默认分隔符为blank)

<cb>:替换光标所在的前一个字符

<C>,<c$>:替换自光标位置至行尾的所有字符

<cc>:替换当前行

u:撤销


翻页功能:

向下翻页ctrl + f,向上翻页ctrl + b

向下翻半页ctrl + d,向上翻半页ctrl + u


光标瞬间转移:(行瞬间转移、单词瞬间转移、行间瞬间转移)

NG:到第N行(或者:N)

gg:到第一行(相当于1G,或者:1)

G:到最后一行

w:到下一个单词的开头

e:到下一个单词的结尾

W:到下一个单词的开头

E:到下一个单词的结尾

区别:单词是字母数字和下划线构成的话:用小写的w和e

单词是由blank字符分隔符:用E和W


有了这几个键:专业代替上下左右和鼠标:(normal模式下)

<h>:向前移动一个字符

<j>:向上移动一行

<k>:向下移动一行

<l>:向后移动一个字符


光标移动:

%:匹配括号移动,包括大中小括号,[ ] { } (),左跳到右,右跳到左

*和#:匹配光标当前所在的单词,移动光标到匹配单词,*是下一个,#是上一个

移动光标到下一个句子),移动光标到上一个句子(

移动到段首{,移动到段尾}

移动到下一个词w,移动到上一个词b

移动到文档开始gg,移动到文档结束G

移动光标到当前屏幕顶端H,移动到当前屏幕中间M,移动到当前底部L


行内移动:

^:到本行的第一个非blank字符

$:到行尾

0:到行首

g_:到本行最后一个不是blank字符的位置

fa:到下一个为a的字符处,a可以改成任意字符

ta:到下一个为a的字符处的前一个字符,a可以改成任意字符

Nfa:在当前行查找第三个出现的a

F和T:和小写字符一样,方向相反(一般的都是:大写字母是向前的,小写字母是向后的,p和P的粘贴命令也是这样的)


强大的编辑功能:

快速插入已经输入过的单词:

CTRL_P:向前搜索补全(看看前面有没有相同前缀的单词来补全)

CTRL_N:向后搜索补全(看看后面有没有相同前缀的单词来补全)

格式化代码:

gg=G:自动缩进的命令,整理全部代码

==:整理当行,加行数整理多行(N==:整理多行)

mG=nG:完成从m行到n行的局部缩进


替换:

全部替换 :%s/s1/s2(将s1的字符串替换的s2)


字符串搜索模式:

搜索模式为 /string,搜索下一处为n,搜索上一处为N


从normal模式进入到insert模式:(不同的快捷键会让光标停在不同的位置)

<a>:在光标后输入文本

<A>:在当前行末尾输入文本

<i>:在光标前输入文本

<I>:在当前行开始输入文本

<o>:在当前行后输入新的一行

<O>:在当前行前输入新的一行

(这里O和o的命令方式与习惯一样:o往后,O往前,A和a与习惯是反的)


强大的两个选项键(官方名称叫做的是:可视模式)

v:进入可视模式,然后配合hjkl的键盘,可以选中多行中的多个字符

V:进入可视模式,然后配合hjkl的键盘,可以选中多行

利用这几个键的好好配合,可以实现替代鼠标的功能

----------------------------------------------------------------------------------------------------------------------------------------------------------------

(华丽丽的分界线,持续更新中)