vim基本使用方法

文件操作

 :q 退出! (更确切的说应该是关闭当前文件)
 :w 文件名 存盘。如果还是保存为当前文件,不必写文件名
 :wq 存盘退出

光标的移动

本节所述皆是在 common-mode(c-mode,在vim又名normal-mode)下的移动,原始的vi只能在c-mode移动光标,在insert-mode只做文字的输入,而不做光标的移动。当然vimelvis的方向键是不论在那一种mode皆可移动自如。

 

基本移动
 
左,或 Backspace 或方向键
下,或 Enter  +(要 Shift 键),或方向键
上,或 方向键或 -(不必 Shift 键)
右,或 Space 或方向键
  • 使用 hjkl键的移动是为了使手不必离开打字区(键盘中央的部位),以加快打字的速度,如果各位不习惯,那就使用方向键吧!
  • Backspace Space的移动方式是到了行首或行尾时会折行,但方向键或 hl键的移动则在行首或行尾时您继续按也不会折行。转折换行的功能是vim的扩充功能,elvis无此功能。
  • jk 及使用方向键的上下移动光标会尽量保持在同一字段。使用Enter+-的上下移动,光标会移至上(下)一行的第一个非空格符处。
  • 好像有点复杂,各位就暂时使用方向键来移动就简单明白了!等您爱上了vim后再来讲究吧。
 
Ctrl-f     PageDown 翻页。
Crtl-b     PageUp 翻页。

 

高级移动
 
是数目字 0 而不是英文字母 o。或是 Hmoe 键,移至行首,
   (含空格符)。
移至第一个非空格符,注意,要 Shift 键。
移至行尾,或 End 键。要 Shift 键。
  • 以上两个按键是源自规则表示式(regular expression),在regexp^是匹配行首,$是匹配行尾。
 
移至档尾(最后一行的第一个非空格符处)
gg 移至档首(第一行之第一个非空格符处)
  • gg vim的扩充功能,在elvis或原始vi中可用1G来移至文件首(是数字1不是英文字l)。
  • 之原意是goto,指移至指定数目行之行首,如不指定数目,则预设是最后一行。
 
移至次一个字(word)前缀。当然是指英文单字。
同上,但会忽略一些标点符号。
移至前一个字字尾。
同上,但会忽略一些标点符号。
移至前一个字前缀。
同上,但会忽略一些标点符号。
移至屏幕顶第一个非空格符。
移至屏幕中间第一个非空格符。
移至屏幕底第一个非空格符。
  • 这和 PageDownPageUp不一样,内文内容并未动,只是光标在动而已。
 
n| 移至第 n 个字符()处。注意,要用 Shift 键。n 是从头起
   算的。
:n 移至第 n 行行首。或 nG

 

特殊移动
 
移至下一个句子(sentence)首。
移至上一个句子(sentence)首。
移至下一个段落(paragraph)首。
移至上一个段落(paragraph)首。
  • sentence 是以. ! ?为区格。
  • paragraph 是以空白行为区格。
 
这是匹配 {}[]() 用的,例如您的光标现在在 { 
   只要按 %,就会跑到相匹配的 } 上。写程序时满好用的。

 

另还有一些 vim 的特殊按键,但这得留待最后才来讲述,否则各位恐怕会头昏眼花了。

基本编辑指令

 

这个单元就开始进入主题了。下编辑指令都是在 commond-mode(c-mode),就是您一进入vim时的模式,只能下指令,不能键入文字。如果印象模糊,请瞄一下第一个单元的内容。这个单元说的是基本的指令,有些比较特殊的编辑指令,因为太有个性了,所以会独立成一个单元来说明。

 

进入 i-mode
 
在光标所在字符前开始输入文字(insert)
在光标所在字符后开始输入文字(append)
在光标所在行下开一新行来输入文字(open)
在行首开始输入文字。
  • 此之行首指第一个非空格符处,要从真正的第一个字符处开始输人文字,可使用 0igI(vim)
 
在行尾开始输入文字。
  • 这个好用,您不必管光标在此行的什么地方,只要按A就会在行尾等着您输入文字。
 
在光标所在行上开一新行来输入文字。
将下一行整行接至本行(Joint)
  • 并无相对的split功能,可在i-mode下按Enter来达成,当然如果您熟macro的话,可自行定义。
  • 使用J时,预设会消去本行的EOL,且上下行接缝间会留下一个空格符,这符合英文习惯,却对中文会造成困扰,欲不留空格符,可使用gJ(大写J指令,但这是vim的扩充功能,elvis不适用。
  • 请您随便找一个档案来试看看,光看文字说明太抽象了。

 

删除
 
删除光标所在处之字符。在 vim  elvis 亦可用 Del 键。
删除光标前之字符。不可使用 Backspace 键。
  • vim 可以正确使用以上两个指令于中文,会删去一个中文字。elvis则不行,一个中文字要删两次,即使用xx
 
dd 删除一整行(delete line)
dw 删除一个字(delete word)。不能适用于中文。
dG 删至档尾。
d1G 删至档首。或 dgg(只能用于 vim)
删至行尾,或 d$(含光标所在处字符)。
d0 删至行首,或 d^(不含光标所在处字符)。
  • 请回忆一下$^所代表的意义,您就可以理解d$d^的动作,这就是vi(m)可爱之处。

 

取代和还原
 
取代光标所在处之字符。vi(m) 很有个性的,您在 c-mode 
    r 她就会停在那里等主人键入所要替代的字符,希望您这
   个当主人的,不要傻呼呼的也楞在那里,赶快键入您的新字符
   吧!:-)
  • vim 中可用于中文字,也就是可以替换一个中文字,elvis则不行。当然您的vim是要设在taiwan的才行。怎么样!有没有看过如此有个性的取代方式?ㄚ!r就是replace啦!
 
取代字符至按 Esc 为止。
cc 取代整行内容。或大写 S 亦可。
cw 替换一个英文字(word),中文不适用。(change)
游标所在处之大小写互换。当然不能用于中文。别忘了 Shift
取代至行尾,即光标所在处以后的字都会被替换。或 c$
c0 取代至行首,或 c^
替换一个字符为您所输入的字符串。和 R 不同,R 是覆盖式的取
   代,s 则是插入式的取代,您可亲自实验看看。ㄟ!是小写的
   s
这个太重要了,就是 undo,传统的 vi 仅支持一次 undovim
    elvis 就不只了,vim 是没有限制的。
U  在光标没离开本行之前,回复所有编辑动作。
Crtl+r 这个也是很重要,就是 redo 键。

 

加上数字

喔!骚到 vi(m) 的痒处了,这是vi(m)一个非常骚包的功能,只此一家别无分号(当然同源的edsed等不在此限)。就是您可以在大部份的指令前加上数目字,代表要处理几次的意思。以下用实例来说明比较清楚。

 
5dd  删除游标所在处(含)起算以下五行内容。妙吧!
3r   按了 3r 后,您键入一个英文字,则三个字符皆会被您所键
       入的英文取代。很抱歉,这不能用于中文。
5J   将五行合并成一行。
3x   删除三个字符。抱歉,不能用于中文。
5i A 然后按 Ecs,插入五个 A。中文也可以!
2i system Esc  插入 systemsystem。中文也可以!
5G 光标移至第五行,是从档首开始起算。
5l 移至右第五个字符处,当然 j 是可以用方向键取代的。
   所有移动指令(参考第二单元)都可以加上数目字来控制,中
   文也通喔!elvis 当然是不能用于中文。

其它的指令和数目字结合,就留待各位去发掘吧!最重要的是请您亲自操作看看,使用vi(m)常常要动动脑筋,会有更妙的操作方式。

 

重排
 
>>  整行向右移一个 shiftwidth(预设是 8 个字符,可重设)。
<<  整行向左移一个 shiftwidth(预设是 8 个字符,可重设)。
  • :set shiftwidth? 可得知目前的设定值。:set shiftwidth=4可马上重设为4个字符。shiftwidth可简写成sw。ㄟ,别忘了Shift键!
 
:ce(nter)  本行文字置中。注意是冒号命令!
:ri(ght)   本行文字靠右。
:le(ft)    本行文字靠左。
  • 所谓置中、靠左右,是参考textwidth(tw)的设定。如果tw没有设定,预设是 80,就是以 80个字符为总宽度为标准来置放。当然您也可以如sw一样马上重设。
 
gqip  整段重排。中文会出槌!:-(
gqq   本行重排。
重排的依据也是 textwidth 。这里的重排是指您键入文字时没有按 Enter 键,就一直在 keyin ,这样会形成一个很长的一行(虽然屏幕上会替您做假性折行),重排后,则会在每一行最后加入 EOL gq 重排功能是 vim 才有的功能。

复制(yank

 

yank 是什么意思?有疑问的请查一下字典吧!就好像是中医治疗中的「拔罐」的意思啦(是不是叫「拔罐」?知道的朋友指正一下吧)!反正在vi(m)中,她就是复制copy的意思。这在vi(m)的思考逻辑里,就是「拔」yank起来,「放」put上去。其实复制的指令就是y一个而已,为什么要独立成一个单元来说明呢?因为vi(m)复制、贴上的功能实在太独特了,再配合第三单元介绍的数目字,及vi(m)内部的缓冲区来使用的话,您会发现,原来vi(m)肚子里还暗藏着秘密武器。

 


 
yy  复制游标所在行整行。或大写一个 Y
2yy  y2y  复制两行。ㄟ,请举一反三好不好!:-)
y^  复制至行首,或 y0。不含光标所在处字符。
y$  复制至行尾。含光标所在处字符。
yw  复制一个 word
y2w 复制两个字。
yG  复制至档尾。
y1G 复制至档首。
p   小写 p 代表贴至光标后(下)。
P   大写 P 代表贴至光标前(上)。
  • 整行的复制,按 p P时是插入式的贴在下(上)一行。非整行的复制则是贴在游标所在处之后(前)。
 
"ayy  将本行文字复制到 a 缓冲区
  • 可为26个英文字母中的一个,如果是小写的话,原先的内容会被清掉,如果是大写的话是append的作用,会把内容附加到原先内容之后。
  • Enter键隔壁的那一个同上符号(ditto marks)。
 
"ap   a 缓冲区的内容贴上。
  • 缓冲区的术语在vim称为registersvim扩充了相当多的功能,有兴趣深入的朋友请:h registers。您用dcsxy等指令改变或删除的内容都是放在registers中的。例如:您用dd删除的一行,也是可以使用p来贴上的。只要是在缓冲区的内容都可以使用 p来贴上,不是一定要y起来的内容才能用 p。因此您认为 ppaste也可以,认为是 put可能较正确。
 
5"ayy  复制五行内容至 a 缓冲区。
5"Ayy  再复制五行附在 a 内容之后,现在 a 中有十行内容了!
  • ㄟ!不要我一直用a您就认为只有a可以用喔。26个英文字母都可以的,交叉运用下,您会发觉vi(m)肚量不小。
  • 问题来了!忘记谁是谁的时候怎么办?:reg(冒号命令)就会列出所有registers的代号及内容。您现在就试着按看看。咦!怎么还有数目字、特殊符号的缓冲区,原来您刚刚删除(复制)的内容就预设放在"这个缓冲区,然后依序是 0,1,2,...9。也就是说您按p不加什么的话,是取出"缓冲区的内容的。%指的是目前编辑的档案,#指的是前一次编辑的档案。还有其它的呀!因为没什么重要,就请:h registers 吧!registers有个"s"结尾,不要搞错了,而且Tab的补全键vim也支持的,也就是说您键入:h regi再按Tab键,vim就会帮您补全,按了Tab后发现不是您要的,那就继续按,总会出现您要的。:-)
  • Tab 补全的功能,elvis也有,但叫出registers列表的命令则没有,您得自行记忆在您的脑袋瓜子里。而且elvis的补全能力并没vim强。

 


 
  .  这是什么?ㄚ,是英文句点啦!没错,就是英文句点。什么意
     思?重复前次的编辑动作。这个指令太高明了,只要是编辑动
     作(移动光标不算,冒号命令也不算)都可以按英文句点来重
     复,要重复几次都可以。

例如:您按了yy,然后按 p就会复制、贴上一整行,如果要重复这个动作的话,就可以按.,也可以把光标移到其它地方后再按。其它dddwrcw等编辑指令都可以这样来重复。如果您要重复做某些编辑动作时,千万千万一定要想到有这么一个英文句点重复指令。ㄚ,拜托啦!您一定要常用这个指令。

 


1. mouse中键的剪贴功能还有吗?

当然还有,不管在console X terminal中都照用不误。当然在windows下的话就不能用了,可以用Shift-Insert来代替。Ctrl-vvim中另有作用,在windows下就不必去麻烦它了。

2. ㄟ,我从netscapemouse copy东东过来的时候,常常都搞得天下大乱耶!

要设成:set paste,预设是mapF9键的,您要copy之前先按一下F9copy完后再按一次F9来回复。这是vim的扩充功能,elvis没有。那在elvis怎么办?只好:set noai了。在GUI的版本应不会有这种情形。

·   set 的功能先不必去理它,往后会有一个单元专门讨论。

查找、替换

 

搜寻、替换的功能几乎是每个编辑器必备的功能,那在vi(m)中有没有特殊的地方呢?当然有,您忘了,vi(m)是个性十足的编辑器。最特殊的地方是和规则表示式(regular expression,简称regexp)结合在一起。简单的说她是一种pattern的表示法,在执行动作,如寻找或替换,就会依据这个 pattern去找,所有符合 pattern的地方就会执行您所下的动作。在这个单元里暂不讨论regexp,会另立一个单元来探讨,以免搞得头昏脑胀。目前就暂不使用regexp,您要找什么就直接键入什么就对了。

 

查找
 
 c-mode 的情形下,按 / 就会在左下角出现一个 /,然后键
   入您要寻找的字符串,按个 Enter 就会开始找。
 / 相同,只是 / 是向前(下)找,? 则是向后(上)找。
继续寻找。
继续寻找(反向)。

 

更方便的查找
 
寻找游标所在处之 word(要完全符合)。
同上,但 * 是向前(下)找,# 则是向后(上)找。
g*  * ,但部份符合即可。
g#  # ,但部份符合即可。
  • n, N 之继续寻找键仍适用。

 

替换
 
:[range]s/pattern/string/[c,e,g,i]
 
range  指的是范围,1,7 指从第一行至第七行,1,$ 指从第一行
       至最后一行,也就是整篇文章,也可以 % 代表。
  • 还记得吗?%是目前编辑的文章,#是前一次编辑的文章。
 
pattern  就是要被替换掉的字符串,可以用 regexp 来表示。
string    pattern  string 所取代。
c  confirm,每次替换前会询问。
不显示 error
g  globe,不询问,整行替换。
i  ignore 不分大小写。
  • 大概都是要加的,否则只会替换每一行的第一个符合字符串。可以合起来用,如cgi,表示不分大小写,整行替换,替换前要询问是否替换。

[实例] :%s/Edwin/Edward/g
    这样整篇文章的 Edwin 就会替换成 Edward

更进阶的寻找、替换的例子在说明 regexp 的时候还会再详述。目前只知道最基本的用法就可以了!其实光这样就非常好用了。:-)

 

书签

这又是 vi(m) 的一个秘密武器,简单的说,您可以在文章中的某处做个记号(marks),然后跑到其它地方去编辑,在呼叫这个mark时又会回到原处。妙吧!

 
mx  x 代表 26 个小写英文字母,这样光标所在处就会被 mark
`x  回到书签原设定位置。
  • backward quote,就是Tab键上面那一个。
 
'x  回到书签设定行行首。
  • forward quote,是Enter键隔壁那一个。

 

书签扩展
 
小写字母  只作用于单一档案内。
大写字母  可作用于编辑中之各档案间。
数目字    可作用于前次编辑的十个档案。
  • 数目字的用法比较特殊,'0是回到前一次编辑档案中离开前的最后位置,'1则是回到前二次编辑档案的最后位置,依此类推。您不必使用m来标示,vim会自动记忆。很玄吧!其实这是viminfo的功能,您要认真追究的话,请:h viminfo-file-marksviminfo关掉,就没这个功能了!
  • 所谓前次指的是前次启动的vim
 
:marks  得知目前所有书签的列表。

猜你喜欢

转载自blog.csdn.net/e6894853/article/details/8967858