vim被vimer称之为编辑器之神,与另一款被emacser称之为编辑器之神的编辑器并称为linux编辑器的泰山北斗。其实习惯了windows操作习惯的人,很难理解linuxer这种对于一个软件近乎狂热的膜拜。我的一个朋友刚刚换到linux下工作时,使用伟大的神器vim编辑一段代码,完了后发现不管怎么搞,都无法保存和退出,也没办法复制粘贴出来,最后只能用鼠标强制关了终端窗口,痛苦万分。然后就十分郁闷的发表了与神器第一次亲密接触后的感觉,他说他实在想不明白linux下的人怎么想的,那些人开发出的件,有些只带一个丑巴巴的界面,有些甚至连界面都没,鼠标也不支持,使用起来要记忆大量的命令,但那些人却爽的不得了,自以为做了一件惊天动地的大事件,到处传诵,奉之为伟大的神器。我猜测这也许是linux下缺少比较成熟完善的IDE开发环境吧。
我接触vim的时间比较短,没有经历过什么大事件,只是为了简单的做android方面的研究和编码。android的代码十分庞大,在eclipse里不仅速度慢,有时还会死掉,这迫使我不得不在linux下寻找更加方便快速的工具。当时可以选择vim和emacs,因为我在android源码目录里发现的emacs的配置文件,所以差一点去学emacs,但后来我在谷歌和百度上分别搜索vim和emacs,搜索的结果vim网页比emacs多好几倍,这使我认识到,也许vim会是个更好的选择,因为有关他的网页比后者多几倍,感觉上也许vimer两样也会比emacser多很多,这通常意味着学习vim要比emacs能获得更多的帮助,后来有一次,我的系统出了问题,无法进入图形界面,查看资料通过vim编辑相应的文件才修复好,其实我不太清楚emacs有没有shell版本,但vim在shell终端为linux保驾护航确实是我对电脑上的资料多了不少安全感,所以我才下定决心来学习vim。
linux下确实缺少像vs和delph那些方法的工具。我不是vimer,只是一个可怜的码农,学习他也不是为了炫耀,更不会拿他来煮咖啡,只为了工作需要。
我习惯上把vim命令或者操作分为浏览,编辑,运行三部分,而vim的操作似乎又可以分为快捷键和命令。vim比其他编辑器好的地方在于,如果你的鼠标坏掉了,你仍然可以坚持用他来完成你的所有工作,曾经在一个论坛上看到一个后进者先大师咨询如何在VIM里使用鼠标复制,大师语重心常的说:孩子,扔掉的鼠标吧。
浏览移动跳转指令
(1). h j k l,方向键,记忆技巧:左右方向的是最左边和最右边的,j向下打了个勾,所以是向下键,剩下的k就是向上的键了。
(2). b, before,上一个单词(词首)
w, word,下一个单词(词首)
e, end,下一个单词(词尾)
注意这些小写的命令由字母,点,数字,下划线划分,还有这三个对应的大写字母的命令,B,W,E,类似的意思,但是是以空格区分移动的。总而言之,大写的移动范围要大。
(3). gg 首行
G 尾行,这两个命令用的较多
(4). n% 跳到n%的那行
(5). ^/0 到行首,我有时特别喜欢0,非常清晰简明的命令
$ 到行尾
(6). - 非空白行首向上移动
+ 非空白行首向下移动
(7). 行移动
nj //向下移动n行
nk //向上移动n行
nh //向左移动n列
nl //向有移动n列
n_ //向下移动n-1行,并光标移动到非空白行首
n- //向上移动n行,并光标移动到非空白行首
(8)跳到函数开头或结尾:
1:跳到函数头 [{
2:跳到函数尾 ]}
[[
]]
[]
][
{}
(8).通过查找字符移动
fx/Fx //向后/前查找字符x,行内跳转很有用
tx/Tx //向后/前查找字符x
//fx/Fx和tx/Tx的区别是用f光标停留在x上,用t光标停留在x的前面一个上
; //执行上次的fFtT
, //反方向执行fFtT,这两个有意思
2.插入,替换,删除
(1).学会a和i混用,不要只会用i进入插入模式,有时a进入插入模式后更方便,比如插入键盘右边的字母符号,用a的话,左右手配合起来效率更高。
(2).学会I和A,快速进入行首和行尾插入模式,特定时刻用起来超爽!
这个很好理解,小写的i是光标前,大小的I是整行前面,o/O类似,画面很清晰。
(3). 学会o和O混用,不要只会用o进入下行编辑:
(3.1). 进入上行编辑,大写的O更快,而不是ko,双手比单手要快!
(3.2). 第一行前面想插入一行时,O比其他任何操作更直接和快速(不要先回到开头<+插入模式>+回车)
(4). r快速替换字符,最大的好处是不需要切换模式,节省了大量时间,非常有用!(R,这个命令我用的少,有的时候用的特别混乱,就不说了)
s 删除光标后一个字符并进入插入模式。该命令提供了r命令+进入插入模式的快速实现方法。
(5). c 这个命令很强大,归类说明一下
cm //m指的是前面的移动命令,类似的有dm,ym,g?m,gum,gUm
//改变内容(m定义了改变范围)并进入插入模式,这里说的改变就是删除,举例说明:
cw //删除光标后一个单词并进入插入模式
cl //删除光标后一个字母并进入插入模式
cc和S修改当前行,意思是删除该行所有字符内容,但保留行首空格
D和C删除该行光标后所有内容,无论字符还是空格,这个命令我用的很多:代码审核格式化代码时,删除空行的空格和行尾空格。
学会结合t这个命令
t //till的意思,这是我最喜欢的命令之一
dt" //行内删除直到","不删除
ct) //行内改变直到),)不删除
(8).学会x和X混用,分别是向前删除和向后删除字符
(9).:nd 删除第n行
3.查找
# //向下一个查找结果
* //向下一个查找结果
//在#/*之后按n/N可以重复/反向重复它们的命令
//下面这两个命令在编程时,很有用
gd //跳转到光标变量的定义位置(局部变量)
gD //跳转到光标变量的定义位置(全局变量)
如要定义了ctag,就可以使用ctrl+t在跳转后返回在到使用的地方
如果你想查查某个字符串在文件中位置,#/*的快捷键能查找光标处的字串,要查找不知道位置的字串,需要命令
:?查找到字符串和:/查找的字符串
撤销和恢复
u //撤销
ctrl+ r //恢复
滚动
ctrl+ e/y //向下/上一行一行的滚动
ctrl+ d/u //向下/上半页半页的滚动
ctrl+ f/b //向下/上一页一页的滚动
shift+m 窗口中间一行
shift+h窗口顶部第一行
shift+l窗口底部最后一行
可视模式(选择块)
可视模式其实非常有用,它的选择很灵活,而且视觉效果上看着和鼠标选择一样,学习成本低,但是功能强大。
(1). v 进入可视模式
(2). shift + v 也就是大写的V,可视模式的行选择,整行整行的选择,用于刚好整行或者大篇幅内容的处理比较方便。
(3).ctrl + v 可视模式的列选择,比行选择模式更加细化,可选择连续的列进入操作
选择块模式需要和其他命令结合:
V+ G //选择当前行一直到文本结尾
V+ G + d //删除当前行一直到文本结尾
V+ G + y //复制当前行一直到文本结尾
V+ gg + d //删除当前行一直到文本开头
V+ gg + y //复制当前行一直到文本开头
ctrl+v+ <移动>+d //删除选择的列
ctrl+v+ <移动>+y //复制选择的列
gv选中上次的选中区域
(5).选中单词,句子,段落:
vaw //选中一个单词(word)
vas //选中一个句子(sentence)
vap //选中一个段落(paragraph)
viw //选中一个单词(word)
vis //选中一个句子(sentence)
vip //选中一个段落(paragraph)
选中括号:
vab //选择()里面的内容,包括小括号
vaB //选择{}里面的内容,包括大括号
7.执行shell命令
//记住这两种用法,你尝到它们的甜头的
:sh //打开shell,可执行shell命令,输入exit退出shell返回到vim
:!cmd //直接执行shell
当然,这个也可以使用快捷键,用CTRL-Z挂起。这个动作把 Vim停下来,并让你回
到那个你启动Vim的命令 shell里。然后再用 "fg"命令回到 Vim。
当你按 CTRL-Z行不通时,你还可以用命令":suspend"。
快速选中、删除、复制、修改引号或括号内的内容
//以下操作一定要熟记,能大大提高你编辑文本的效率
ci'、ci”、ci(、ci[、ci{、ci< //分别更改这些配对标点符号中的文本内容
di'、di”、di(或dib、di[、di{或diB、di< //分别删除这些配对标点符号中的文本内容
yi'、yi”、yi(、yi[、yi{、yi< //分别复制这些配对标点符号中的文本内容
vi'、vi”、vi(、vi[、vi{、vi< //分别选中这些配对标点符号中的文本内容
专题二:替换
查找并替换操作使用的太频繁了,下面针对这个专题从网上或书籍上收集了替换的几个常用的强大用法
//语法
/**
*说明
*range表示行数,如果是%表示所有行
*s表示substitution,替换的意思
*flag表示标志,取值g,i,c等
*g表示global,全部
*i表示ignore,忽略大小写
*c表示confirm,一个一个交互确认替换
*count表示从当前行到接下来的第几行,表示范围
*/
:[range]s/{pattern}/{string}/[flag][count]
(1).全部替换
参数g实现全部替换,否则只替换一个
(1).全部替换
参数g实现全部替换,否则只替换一个
:%s/{old-pattern}/new-text/g
(2).行内替换
%代表所有行,去掉%表示当前行,只替换当前行
:s/{old-pattern}/new-text/g
(3).指定行范围替换
对1到10行的结果替换
:1,10s/{old-pattern}/new-text/g
(4).可视模式替换
如果你觉得数行数比较麻烦,可以使用可视模式,首先进入可视模式,然后选择行
列,最后输入:自动进入:'<,'>
后面加上s/{old-pattern}/new-text/g,则只替换选择区域的结果
:'<,'>s/{old-pattern}/new-text/g
(5).整词替换,而不是部分匹配的单词
对单词匹配模式外包一个<和>
:s/\
(6).多项替换
同时对多个匹配都替换成某一字符串
:%s/\(good\|nice\)/awesome/g //good和nice都将被替换成awesome
确认式替换
参数c让替换进行交互请求,需要你选择y,n,a,l,q
/**
*选择说明:
*y 替换且跳转到下一个匹配结果
*n 不替换且跳转到下一个匹配结果
*a 替换所有并退出交互模式
*l 替换当前并退出交互模式
*q 退出交互模式
*/
:s/{old-pattern}/new-text/gc
(8).行首插入行号
把行首^替换成行号,可自定义具体形式
:%s/^/\=line(".")/g
大小写转换
讲这个,主要是觉得这个问题挺有意思的。
~ //改变当前字符并自动切换到下一个字符,大写变小写,小写变大写,可以一直按
gum //转化为小写,m指移动命令,如:
//guw 光标后的一个单词小写化
//guG 光标所在行到最后行全部小写化
//gut= 光标后直到=之间的字符小写化
//罗嗦一句,gu还可以与可视模式结合,小写化所选区域
gUm //转化为大写,用法同上
录制
这个其实很简单,但也是很强大的功能,单独柃出来说一下。
//为操作定义宏或者取别名
//这个命令的强大之处在于使重复复杂指令的简单化了
q //按下q开始录制
x //x是这个录制的寄存器,x可以是其它字符
dd //删除当前行,这个操作可以自定义其他复杂的操作
q //录制结束,现在dd这个操作被定义到了@x这个命令里了
数字增减
这个小技巧还挺有用的,比如说定义了一系列staticfinal变量,而且时不时要中间插入一些新的变量,这些值一般都是递增的,这时候这个技巧绝对比数字替换要方便。
//Normal模式下执行
Ctrl+ a //自增1
Ctrl+ x //自减1
一、vim打开文档:
1.vim 文档名 普通方式打开文档
2.vim +n 文档名 打开文档后,定位第n行
3.vim ,进入vim界面之后使用命令:e文档名 打开文档,此方式可以在编辑一个文档的同时打开另外一个文档
二、多文档编辑:
1.vim 文档1名文档2名...
2.vim ,进入vim后使用:e文档名 打开文档
3.多文档编辑的命令如下
:n 编辑下一个文档。
:2n 编辑下两个文档。
:N 编辑上一个文档。注意,该方法只能用于同时打开多个文档。
:e文档名 这是在进入vim后,不离开vim的情形下打开其他文档。
:e#或 Ctrl+ˆ 编辑上一个文档,用于两个文档相互交换编辑时使用。?#代表的是编辑前一次编辑的文档
:files或 :buffers或 :ls 可以列出目前缓冲区 中的所有文档。加号 +表示 缓冲区已经被修改过了。#代表上一次编辑的文档,%是目前正在编辑中的文档
:b文档名或编号 移至该文档。
:f 或Ctrl+g 显示当前正在编辑的文档名称。
:f檔名 改变编辑中的文档名。(file)
三、离开vim
:q 如果文本没有修改,则会退出,否则会出现警告,且不能离开。
:q! 放弃所有修改,强行离开。
:wq 保存后离开即使文档没有修改过,也会再保存一次。
:x 保存后离开,文档如果没有修改过则不会进行保存动作,直接离开。
:w文档名 即:另存为。不加文档名则是写入原文档。
:qa或 qa!在打开多文档的情况下离开 vim。a即 all的意思。
四、 多窗口编辑
:sp文档名 在新窗口中打开文档
两次Ctrl+ w可以切换窗口
:q 退出当前编辑窗口
14 vim的复制也是一大特色
v逐字逐行选择,上下左右移动有效。
V整行选择,上下移动有效,左右仅移动光标。
ctrl-v或ctrl-Q(Windows)矩形块选择,上下左右移动有效。
o光标移动到选择文字的另一端,(矩形块选择时o只是移到对角上,O移动到同一行另一个角上。)
y复制,适用于选择文本后再按y复制
yw复制一个单词(包括空格) ye复制一个单词(不包括空格)
yy复制一整行,类似dd删除一整行(包括行尾换行符)
Y复制一整行(包括行尾换行符),不同于D删除到行尾(不包括换行符)
2yy或 y2y 複製兩行
注:y为操作符,可加计数前缀,例如:2yw=y2w(复制两个单词)
p小写p代表贴至游标后(下)。
P大写P代表贴至游标前(上)
1.复制后的文本会保存在剪切板,Windows中的剪切板相当于Vim中的寄存器。
2.查看寄存器的内容,用 :reg命令
3.VIM中共有九种类型的寄存器:(更多寄存器帮助 :helpregisters)
无名寄存器 ""
10个编号寄存器 "0到 "9
行内删除寄存器 "-
26个命名的寄存器 "a到 "z或者 "A到 "Z
四个只读寄存器 ":、".、"%和 "#
表达式寄存器 "=
选择和拖放寄存器 "*、"+和 "~
黑洞寄存器寄存器 "_
最近搜索模式寄存器 "/
1、将选择文本复制进寄存器
<">+<寄存器 >+<复制文本 >
例如:复制一单词到系统剪切板(Windows中* 和+寄存器效果一致)
"*yw
2、粘贴寄存器中的内容
<">+<寄存器 >+
例如:粘贴该单词到系统任意位置
"*p
vim有很多插件,这些插件功能五花八门,要全部学习他们无疑是件很困难的事。其实我觉得不使用插件工作才是最好的,因为不使用插件,如果换个电脑,换个工作环境,只要电脑上有vim, 我们就能很方便快捷的使用,而如果习惯的在插件的帮助下工作,一旦脱离的插件,工作效果就会急剧降低,甚至无法工作。而且在某些情况下,这是很容易出现的,有些公司出于安全考虑,电脑既不能上网,也不能使用U盘,学会在不依赖工具的情况下,快速高效的工作,就能使自己应对各种挑战。当然必要的通用的已经集成的插件,还是应该使用的,这能帮助我们更好的工作。ctags和cscope可以使vim实现像sourceinsight一样的效果,这对于在win下习惯了的人们,多少可以增加一点学习的信心。这两人个工具一般系统都带有,如果没有,是可以直接使用aptget安装的。
1.在Android源码顶层目录下运行ctags-R 生成tags文件
在Android源码顶层目录运行cscope-Rbq,生成cscope.out文件
在源码顶层目录下运行vim,使用命令加载生成的标签文件
:csadd ~/androidcode/and4_2/mbk89_tb_jb2/alps/cscope.out~/androidcode/and4_2/mbk89_tb_jb2/alps
~/androidcode/and4_2/mbk89_tb_jb2/alps为源码路径,需要两次,一次是指出生成标签文件路径,cscope.out在的路径,一个是工作目录路径,源码在的路径,因为在源码里生成,所以两者路径一样
:settags=~/androidcode/and4_2/mbk89_tb_jb2/alps/tags
然后就可以使用vim跳转技巧和编辑技巧来工作了。
5.有人使用修改~/.vimrc使之可以自动加载tags和cscope.out文件,这对于工作路径不经常变动而且只有一个人使用电脑的情况下是适用的,如果电脑是公用的,这种修改会导致别人修改自己的代码时遇到困难。同时要注意要使用ctags和cscope数据库,必须在android源码顶层运行vim程序
16.对于研究代码来说,vim做为强大编辑器,有其他没有的更自由的自定义配置。这些可以写入~/.vimrc中,也可以使用命令行手动修改,对于个人电脑,简单设置一下,使用起来更方便,如果公共电脑,就试着记一下吧,行号了,主题了,背景了,还是管用的
sethistory=50 "历史记录50条
setfenc=utf-8 "设置默认语言为utf8
filetypeon "打开文件类型检测
""颜色设置.
colorschemedelek "主题
"colorschemeevening "主题
syntaxon "语法高亮
"sethls " 查找文本高亮
"界面设置.
setruler "显示当前位置
setnumber "显示行号
""setnonumber "不显示行号
"格式设置.
setautoindent "自动缩进
setsmartindent "智能缩进
setcindent "C缩进
settabstop=4 "硬TAB
setsofttabstop=4 "软TAB
setshiftwidth=4 "缩进空格数
setexpandtab "空格替换TAB
"setsmarttab "智能TAB
"
setshowmatch "显示匹配
"setmatchtime=5 "1/10秒延迟
"sethlsearch "高亮搜索
"setincsearch "搜索中匹配
set tags=tags;"ctags
"setautochdir "ctags
当然,还有一些插件也是有用的,比如taglist之类,需要灼情使用
16。vim开发anroid
1.生成android工程
Androidcreate project -n test –activity demo –packagecn.forwind.myproject –target 3 –path ./myproject
2.创建配置文件
ProjectCreate./myproject -n java
3.创建模拟器
Androidcreate avd -n forwind.cn
4打开vim,执行命令
:ProjectList
命令,确认一下,myproject这个project是被认出来了的。好,我们现在试着运行
:ProjectTreemyproject
5. 运用vim 技巧修改完成了,就可以编绎了,如果工程同样使用了NDK 技术,需要先进入jni 目录执行一下ndk-build
来生成so
文件,如果出错了,可以使用
ndk-build NDK_LOG=1
来查看出错的提示并修改。
6
。如没有NDK
技术,可以直接使用如下命令创建build.xml
文件,
androidupdate project --target 3 -p . -s
7
。然后使用如下命令生成
apk
应用
antdebug
或者
antrelease
8. 可以启动模拟器, 然后使用adbpush 或者adbinstall 来安装这个应用
emulator-avn AVD_NAME
.
参考文档:
http://www.jb51.net/article/36195.htm
http://blog.chinaunix.net/uid-9789774-id-3067684.html
http://blog.csdn.net/huiguixian/article/details/6231425
http://blog.csdn.net/dadoneo/article/details/6044058