相信一个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的键盘,可以选中多行
利用这几个键的好好配合,可以实现替代鼠标的功能
----------------------------------------------------------------------------------------------------------------------------------------------------------------
(华丽丽的分界线,持续更新中)